[英]Kotlin coroutines not downloading data
我在Android項目中使用Kotlin corountines。 我正在嘗試下載一些數據並在textview中顯示。
以下是我的代碼
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() ?: ""
}
}
但是沒有下載數據。 我不知道為什么。
我已將Internet許可包括在清單中,並且該網址也正在工作。
嘗試這個:
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
或Presenter
,但我在代碼中看不到任何東西...
第三,在定義后立即使用async
和await
毫無意義。 只需使用withContext
然后。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.