我正在尝试使用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()
,但这也没有用。
无论如何,任何帮助都会深深感激。
答案 0 :(得分:5)
在setText
之外调用main thread导致问题textView1
内容无法更新。
The documentation显示了如何正确使用async
的一个很好的示例。请查看以下改编版代码:
async() {
val result = URL("http://stackoverflow.com/").readText()
uiThread {
textView1.text = result
}
}
答案 1 :(得分:0)
这个问题比我想的要简单得多。这是一个兼容性的问题,显然是因为旧版本的Android Studio与Kotlin插件的新版本1.0.2一起运行,而且,显然函数readText无法正常工作,因此我没有得到任何东西。
无论如何,我使用最新版本的Kotlin更新了Android Studio,它开始工作正常,但我会看看是否可以找出导致readText内部问题的原因。