kotlin 如何在每次Fragment.onResume调用时重新启动协同程序?

5vf7fwbs  于 2022-11-16  发布在  Kotlin
关注(0)|答案(2)|浏览(156)

我有一些协程应该在每次Fragment调用onResume()时重新启动。
我尝试过以下方法:

val renderer = ...
val outerFlow = ...
val lifecycleCoroutineScope = myFragment.viewLifecycleOwner.lifecycleScope

lifecycleCoroutineScope.launchWhenResumed {
   outerFlow.onEach(renderer::render).launchIn(this)
}

但它只工作到Fragment的视图第一次被破坏。我的意思是第二次和下面的onResume()调用被忽略。
所以请你帮我找出:如何在每次onResume()调用时正确启动协同程序?

zlhcx6iw

zlhcx6iw1#

我认为是呼叫launchIn(this)无法接通,请尝试呼叫其他终端话务员,如collect

lifecycleCoroutineScope.launchWhenResumed {
   outerFlow.collect(renderer::render)
}

医生说:
不建议使用此API,因为它在某些情况下会导致资源浪费。请改用Lifecycle.repeatOnLifecycle API。此API将在未来的版本中删除。
对于Lifecycle.repeatOnLifecycle,它将类似于以下内容:

lifecycleScope.launch {
    lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED) {
        outerFlow.collect(renderer::render)
    }
}
egmofgnx

egmofgnx2#

我已经解决了这个问题。
问题不在协程中,而是在LifecycleOwner中。在Lifecycle获得Lifecycle.State.DESTROYED状态后,它也会破坏,不再工作。
我被绑定到Fragment视图的生命周期,当我们离开当前片段后,它的视图生命周期被破坏。

因此,将fragment.viewLifecycleOwner.lifecycleScope替换为fragment.lifecycleScope对我很有帮助。

相关问题