如何在每个Fragment.onSume调用上重新启动协同程序



我有一些协同程序,应该在每次调用FragmentonResume()时重新启动。

我尝试了以下方法:

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.repeatOnLifecycleAPI。此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对我有帮助。

最新更新