簡體   English   中英

如何在不使用 GlobalScope 的情況下在主線程上啟動協程?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM