簡體   English   中英

協程 scope 上的應用程序 class android

[英]Coroutine scope on Application class android

我需要在我的 android Application上引用協程 scope 。 我做了以下

class TodoApplication : Application() {
    private var job = Job()
    private val applicationScope = CoroutineScope(Dispatchers.Main + job)

    val tasksRepository: TasksRepository
        get() = ServiceLocator.provideTasksRepository(this, applicationScope)

}

這是做它的方法嗎。 如果是這樣,我如何取消在此 scope job.cancel()上啟動的協程

應用程序 class 沒有 onDestroy 方法作為活動

不, GlobalScope適合應用程序實例。

正如本文中提到的這里


不應該使用 GlobalScope 的原因有很多:

  • 促進硬編碼值。 如果您直接使用GlobalScope ,那么硬編碼Dispatchers可能很誘人。 這是一個不好的做法!

  • 它使測試變得非常困難。 由於您的代碼將在不受控制的 scope 中執行,因此您將無法管理由它啟動的工作的執行。

  • 您不能像我們對applicationScope所做的那樣,為 scope 中內置的所有協程擁有一個通用的 CoroutineContext。 相反,您必須將一個通用的CoroutineContext傳遞給由GlobalScope啟動的所有協程。


因此,解決方案是創建自己的 scope !

val applicationScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)

我們不需要取消此 scope,因為我們希望它在應用程序進程處於活動狀態時保持活動狀態,因此我們不持有對 SupervisorJob 的引用。 我們可以使用這個 scope 來運行需要比調用 scope 可能在我們的應用程序中提供的生命周期更長的協程。

根據現有的答案,我想出了這個解決方案:

class YourApplication : Application() {

    companion object {
        var applicationScope = MainScope()
    }
    
    override fun onLowMemory() {
        super.onLowMemory()
        applicationScope.cancel("onLowMemory() called by system")
        applicationScope = MainScope()
    }
}

onLowMemory() 部分在某種程度上是可選的,但似乎是個好主意,因為未完成的作業可能會在應用程序的整個生命周期內一直放在那里並使用系統資源。

我們不需要在onDestroy中取消此 scope,因為我們希望它在應用程序進程處於活動狀態時保持活動狀態,如接受的答案中所述。

GlobalScope適用於 Application 實例。taskRepository 變量的get( ) 方法將作為Provider Pattern工作。 它不應該在應用程序實例中。 可以用惰性方法代替。

您可以使用onLowMemory()釋放應用程序 class 上的 CoroutineScope()。 onLowMemory()類似於onDestroy()

val applicationScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)

清除 scope

override fun onLowMemory() {
    super.onLowMemory()
    applicationScope.cancel()
}

onLowMemory 方法釋放您可能持有的任何緩存或其他不必要的資源,從該方法返回后系統將為您執行垃圾回收。

另一種解決方案可能是使用ProcessLifecycleOwnerlifecycleScope范圍:

class GHSApplication : Application() {
    ...
    override fun onCreate() {
        super.onCreate()
        with(ProcessLifecycleOwner.get()) {
            lifecycle.addObserver(yourProcessLifeCycleObserver)
            lifecycleScope.launch { TODO("Do some work here.") }
        }
        ...
    }
    ...
}

在此處檢查必要的依賴項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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