android - Kotlin协程不下载数据
问题描述
我在我的 Android 项目中使用 Kotlin corountines。我正在尝试下载一些数据并在文本视图中显示。
以下是我的代码
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
tv.setOnClickListener {
downloadData()
}
}
private fun downloadData() {
runBlocking {
pb_activity_main.visibility = View.VISIBLE
var data = ""
async {
data = downloadDataBlocking()
}.await()
tv.text = data
pb_activity_main.visibility = View.GONE
}
}
private fun downloadDataBlocking(): String {
val client = OkHttpClient()
val request = Request.Builder().url("https://jsonplaceholder.typicode.com/posts").build()
val response = client.newCall(request).execute()
return response.body()?.string() ?: ""
}
}
但是没有下载数据。我不知道为什么。
我已经在清单中包含了互联网许可,并且网址也可以使用。
解决方案
试试这个:
class MainActivity : AppCompatActivity(), CoroutineScope {
private val job = Job()
override val coroutineContext = Dispatchers.Main + job
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
tv.setOnClickListener {
downloadData()
}
}
private fun downloadData() {
launch {
pb_activity_main.visibility = View.VISIBLE
tv.text = withContext(Dispatchers.IO) { downloadDataBlocking() }
pb_activity_main.visibility = View.GONE
}
}
private fun downloadDataBlocking(): String {
val client = OkHttpClient()
val request = Request.Builder().url("https://jsonplaceholder.typicode.com/posts").build()
val response = client.newCall(request).execute()
return response.body()?.string() ?: ""
}
}
第一:你不应该使用runBLocking
超出单元测试或其他特殊领域。
不应从协程中使用此功能。它旨在将常规阻塞代码连接到以挂起样式编写的库,以用于主要功能和测试。
第二:
协程总是与应用程序中的某个局部范围相关,这是一个生命周期有限的实体,如 UI 元素。
这就是为什么Activity
实现CoroutineScope
. 老实说,一个更好的地方是ViewModel
or Presenter
,但我在代码中看不到任何东西......
async
第三,在定义之后使用它是毫无意义await
的。那就用withContext
吧。
推荐阅读
- javascript - 将 CSV 文件读取到 HTML 下拉菜单
- git - 如何配置 Araxis Merge 以与 Visual Studio Git 一起使用?
- apache-spark - 在 pyspark 中,是否可以用另一列填充?
- cordova - Inappbrowser Skype 通话
- c++ - What is the type of decltype(*int_iterator + 0)?
- asp.net - ASP.NET Core 等待 WebSocket.ReceiveAsync 阻止 IIS 关闭 dotnet.exe
- r - predict.glmnet:某些因素在新数据中只有一个级别
- google-chrome-extension - 如何回滚我的 chrome 扩展同步?
- sql - 需要返回每个位置每天的所有可用时间段
- gtk - 是否为使用“gtk_list_store_newv”创建的对象分配了“新”的内存