1.
我在用:
override fun updateNotification(mediaSession: MediaSessionCompat) {
if (!PlayerService.IS_RUNNING) return
GlobalScope.launch {
notificationManager.notify(NOTIFICATION_ID, buildNotification(mediaSession))
}
}
我可以使用:
override fun updateNotification(mediaSession: MediaSessionCompat) {
if (!BeatPlayerService.IS_RUNNING) return
CoroutineScope(Dispatchers.IO).launch {
notificationManager.notify(NOTIFICATION_ID, buildNotification(mediaSession))
}
}
2.
我在用:
GlobalScope.launch {
while (true) {
delay(100)
mediaMediaConnection.mediaController ?: continue
val newTime = mediaMediaConnection.mediaController?.playbackState?.position
if (state == BIND_STATE_BOUND) newTime?.toInt()?.let { update(it) }
if (state == BIND_STATE_CANCELED) break
}
}
我可以使用:
CoroutineScope(Dispatchers.IO).launch {
while (true) {
delay(100)
mediaMediaConnection.mediaController ?: continue
val newTime = mediaMediaConnection.mediaController?.playbackState?.position
if (state == BIND_STATE_BOUND) newTime?.toInt()?.let { update(it) }
if (state == BIND_STATE_CANCELED) break
}
}
在我的音樂應用程式中使用GlobalScope.launch與CoroutineScope().launch 時,我沒有看到任何明顯的區別。
有人可以解釋在我的背景關系1 和 2 中使用哪個更好
我見過:
為什么不使用 GlobalScope.launch?
但不太完全理解,尤其是在我的用例中。
uj5u.com熱心網友回復:
有人可以解釋在我的背景關系 1 和 2 中使用哪個更好
兩者都不。
它們的問題在于它們幾乎不受約束。他們不尊重應用程式的生命周期,這意味著如果您的應用程式關閉(或用戶離開該螢屏)而某些協程在這些范圍內運行,它們將不會停止執行并會泄漏協程(應用程式甚至可能崩潰)
我的應用什么時候會崩潰:
GlobalScope.launch {
fetchUserData() // --> this is a suspend function
updateUI() // e.g. progressBar.isVisible = false
}
在這里,如果用戶fetchUserData在暫停時離開螢屏。然后該代碼不會停止執行,當fetchUserData回傳時,它將嘗試更新 UI,但由于螢屏已更改,它將引發例外并且您的應用程式將崩潰。
我們想要的是協程在不再需要時應該停止。如果你使用GlobalScope你失去所有的控制。對于自定義的情況CoroutineScope,如果您在正確的時間取消它,一切都很好,否則也是有害的。
什么是替代方案?
您可以/應該使用 android 提供的內置范圍,例如lifecycleScope和viewModelScope。第一個跟隨活動(或片段)的生命周期,而第二個在視圖模型被銷毀時被清理。
所以,這是一般性建議。來到你的特殊情況,
- 在您的第一種情況下,您甚至不需要協程范圍,因為它
notify是一個非常簡單的函式(既不掛起也不阻塞) - 在第二種情況下,您有一個無限回圈,當滿足特定條件時會中斷。由于您在 ViewModel 中有此代碼,因此您很可能不希望它在視圖模型被清除后運行。如果你使用
CoroutineScope()或者GlobalScope你將無法控制它。所以你應該在viewModelScope這里使用 a以便在不再需要作業時無限回圈停止。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/362388.html
