API调用不能在Anko Async中使用

我正在尝试使用Kotlin在Android中发出一个http请求,而且我遇到了两种这样做的方法。

一个是传统的方式,使用AsyncTask (不是很漂亮),我得到了下面的代码(只是doInBackground ,因为其余的类似乎是不必要的):

 override fun doInBackground(vararg params: Void?): String? { val url = URL("myUrl") val httpClient = url.openConnection() as HttpURLConnection if(httpClient.getResponseCode() == HttpURLConnection.HTTP_OK){ try { val stream = BufferedInputStream(httpClient.getInputStream()) val data: String = readStream(inputStream = stream) return data; } catch (e : Exception) { e.printStackTrace() } finally { httpClient.disconnect() } }else{ println("ERROR ${httpClient.getResponseCode()}") } return null } 

现在,我遇到了一个名为Anko的库,在这里很多人都知道,我试图使用DSL来执行异步任务。 事情是,在这里我还没有找到关于Anko异步任务的很多信息,所以我想我会打开一个新的话题,看看有人能够通过我做错了什么,或者他们认为我应该要做到这一点。

我想要使​​用的代码如下:

 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) async() { val result = URL("myUrl").readText() textView1.setText(result) } } 

我尽量保持苗条,尽量减少任何潜在的错误,但我必须在这里做错了,因为异步块内的代码没有做任何事情,但应用程序没有崩溃,我没有得到任何异常。 我试过使用Intellij IDEA进行调试,但在异步块内的第一行之后,它会停止调试,同时说“应用程序正在运行”。 我最好的猜测是,由于连接失败,它被挂在第一行的某处,但我不知道。

我也尝试在异步块内部使用常规URL("myUrl").openConnection() ,但是这也没有奏效。

无论如何,任何帮助将深表谢意。

没有得到更新的问题textView1内容是由主线程外调用setText造成的。

该文档显示了一个很好的例子,如何正确使用async 。 看看你的代码的以下修改版本:

 async() { val result = URL("http://stackoverflow.com/").readText() uiThread { textView1.text = result } } 

PS。 虽然没有直接相关的问题考虑使用更好的HTTP客户端即Retrofit , OkHttp

这个问题比我想象的要多得多。 这是一个兼容性问题,显然有一个旧版本的Android Studio与Kotlin插件的新版本1.0.2运行,再次,显然,功能readText不能正常工作,因此我没有得到任何东西。

无论如何,我更新了Android Studio,最新版本的Kotlin,并开始工作正常,但我要看看是否可以找出是什么导致readText内的问题。