我有一些协同程序,应该在每次调用Fragment
的onResume()
时重新启动。
我尝试了以下方法:
val renderer = ...
val outerFlow = ...
val lifecycleCoroutineScope = myFragment.viewLifecycleOwner.lifecycleScope
lifecycleCoroutineScope.launchWhenResumed {
outerFlow.onEach(renderer::render).launchIn(this)
}
但它只有在Fragment
的视图第一次被破坏之前才起作用。我的意思是,第二个和接下来的onResume()
调用被忽略了。
因此,请帮助我了解:如何在每次onResume()
调用上正确启动协同程序
我认为它不起作用,因为调用了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)
}
}
我已经解决了这个问题。
问题不在于协同活动。它在LifecycleOwner
中。在Lifecycle
获得Lifecycle.State.DESTROYED
状态后,它也会破坏并且不再工作。
我被绑定到Fragment
视图的生命周期。在我们离开当前片段后,它的视图的生命周期会被破坏。
所以将fragment.viewLifecycleOwner.lifecycleScope
替换为fragment.lifecycleScope
对我有帮助。