API调用在Anko Async中无法正常工作

Gon*_*ino 5 android asynchronous android-asynctask kotlin anko

我正在尝试使用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
}
Run Code Online (Sandbox Code Playgroud)

现在,我遇到了一个名为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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我也试过URL("myUrl").openConnection()在异步块中使用常规,但这也没有用.

无论如何,任何帮助将深表感谢.

mie*_*sol 5

问题textView1内容未更新是由主线程setText外部调用引起的.

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

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

PS.虽然与问题没有直接关系,但考虑使用更好的http客户端,即Retrofit,OkHttp