【问题标题】:Android coroutine viewmodelscope cancelAndroid协程viewmodelscope取消
【发布时间】:2020-06-04 08:42:48
【问题描述】:

我见过很多使用作业作为在视图模型被销毁时取消协程的方法的示例。

class SetupViewModel : ViewModel() {

    private val completableJob = Job()
    private val coroutineScope = CoroutineScope(Dispatchers.IO + completableJob)

    override fun onCleared() {
        super.onCleared()
        completableJob.cancel()
    }
}

对我来说奇怪的是似乎没有人使用 coroutineScope 来做到这一点。我认为这应该更容易并且代码更少。任何的想法?

class SetupViewModel : ViewModel() {
    private val coroutineScope = CoroutineScope(Dispatchers.IO)

    override fun onCleared() {
        super.onCleared()
        coroutineScope.cancel()
    }
}

【问题讨论】:

    标签: android viewmodel coroutine


    【解决方案1】:

    您可以轻松地使用lifecycle-viewmodel-ktx 并使用库已经定义的viewModelScope,并且您不需要覆盖onCleared,阅读更多here

    【讨论】:

    • 是的,我知道那个。但是在其他情况下,你如何取消协程呢? Job.cancel() 还是 coroutineScope.cancel()?我正在努力寻找最佳做法。
    • 在我阅读了viewModelScope 的实现之后,我认为你可以使用 coroutineScope.cancel()
    • 你是对的,太奇怪了,每个人都只是在复制,而实际上它可以更简单
    • medium.com/androiddevelopers/… 看看这里,我想我们只需要在需要取消指定作业时才需要 job.cancel()。
    • 诀窍是人们使用cancelAllChildren 的东西,因为一旦你在一个范围上调用.cancel(),它就是一个最终的和不可逆转的东西。
    【解决方案2】:

    我想你的方法实际上是正确的。究竟是什么问题?

    【讨论】:

    • 我试图找到最佳实践,但我看到的所有教程都使用作业来取消协程,而 coroutineScope 可以为我们做到这一点。我不明白为什么所有示例都不使用它。
    猜你喜欢
    • 2020-10-07
    • 2020-01-04
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2021-05-17
    • 1970-01-01
    相关资源
    最近更新 更多