【发布时间】:2017-06-02 00:03:28
【问题描述】:
所以我正在尝试编写一个非常简单的 Android 应用程序,该应用程序在按下按钮时从 URL 获取响应。 kotlin Android 扩展已被宣传为 Java 中必需的样板的替代品,所以我尝试了我的手。到目前为止,这是我尝试过的:
package com.example.susemihl.myapplication
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.widget.TextView
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.coroutines.experimental.CommonPool
import kotlinx.coroutines.experimental.async
import kotlinx.coroutines.experimental.runBlocking
import java.net.URL
suspend fun fetch_url(url: String): String {
return URL(url).readText()
}
fun fetch_async(url: String, view: TextView) = runBlocking {
val result = async(CommonPool) { fetch_url(url) }
view.setText(result.await())
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mainTextView.setText("Hello there.")
mainButton.setOnClickListener {
mainButton.setText("Check again.")
fetch_async("https://random-app.appspot.com/",
mainTextView)
}
}
}
这间歇性地工作,但现在完全坏了。按钮单击没有响应。打印调试显示线程已执行,但似乎挂在 readText() 调用上。我在这里做错了什么愚蠢的事情?
【问题讨论】:
-
似乎我使用的 kotlin.io kotlin-stdlib 库版本不适用于 android-extensions 或类似的东西。它现在又开始工作了。
-
这里是 build.gradle 文件,供参考:paste.ee/p/zJtZO
-
您将阻塞函数命名为异步?
-
将
runBlocking更改为launch(UI)是否有效?为此,您需要 this 库。 -
在
ViewModel中做网络逻辑比在Activity中更好
标签: android kotlin kotlin-android-extensions