Anko异步API调用异步
我试图使用Kotlin在Android中发出http请求,并且我遇到了两种这样做的方法。Anko异步API调用异步
一种是传统方法,使用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
内容没有得到更新是由main thread以外调用setText
造成的。
The documentation显示了一个很好的例子,如何正确使用async
。看看你的代码的以下改编版本:
async() {
val result = URL("http://stackoverflow.com/").readText()
uiThread {
textView1.text = result
}
}
这个问题比我想象的要更为基本。这显然是一个兼容性问题,因为有一个老版本的Android Studio与Kotlin插件的新版本1.0.2一起运行,并且显然readText函数工作不正常,因此我没有从中获得任何东西。
无论如何,我更新了Android Studio,使用最新版本的Kotlin,并且它开始正常工作,但是我要查看是否可以找出导致readText内部问题的原因。
实际上,我已经能够从uiThread和异步线程中更新textView1,所以这实际上不是问题,虽然你放它的方式是使用它的正确方法。 –