[英]How to start a coroutine on main thread without using GlobalScope?
每當我想在主線程上啟動協程時,
fun main(args: Array<String>) {
GlobalScope.launch {
suspededFunction()
}
}
suspend fun suspededFunction() {
delay(5000L) //heavy operation
}
GlobalScope 被突出顯示,並且總是嘲諷它的用法很微妙並且需要小心。
GlobalScope 涉及哪些細節,重要的是我如何在不使用 GlobalScope 的情況下啟動協程?
要在不使用 GlobalScope 的情況下啟動協程,可以這樣做:
val job = Job()
val scope = CoroutineScope(job)
scope.launch {
suspededFunction()
}
正如評論中提到的,一些類已經有可用的范圍,比如ViewModel
class as viewModelScope
。
在 Activity 或 Fragment 中你可以如下:
//not recommended to use co-routines inside fragment or activity class
// this is just for example sack shown here.
// otherwise you have to do all your processing inside viewmodel
class Fragment : CoroutineScope by MainScope() {
...
override fun onDestroy() {
super.onDestroy()
cancel()
}
}
Kotlin已經創建了一些scope,大家可以根據自己的情況使用。 並且您還創建了自己的 scope。但我建議一開始最好使用已經創建的檢查官方文檔https://developer.android.com/topic/libraries/architecture/coroutines
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(viewBinding.root)
lifecycleScope.launch {
//for activity
}
}
//for viewmodel
suspend fun abc() = viewModelScope.launch {
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.