5

我正在尝试使用 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()在异步块中使用常规,但这也没有奏效。

无论如何,任何帮助将不胜感激。

4

2 回答 2

5

问题内容没有更新是在主线程textView1调用引起的。setText

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

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

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

于 2016-05-15T20:18:22.503 回答
0

事实证明,这个问题比我想的要基本得多。这显然是一个兼容性问题,因为旧版本的 Android Studio 与 Kotlin 插件的新版本 1.0.2 一起运行,而且显然函数 readText 无法正常工作,因此我没有从中得到任何东西。

无论如何,我用最新版本的 Kotlin 更新了 Android Studio,它开始正常工作,尽管我要看看是否能找出导致 readText 内部问题的原因。

于 2016-05-17T08:27:31.653 回答