在我的应用程序中,我想使用协程和使用循环乐趣。
我希望当片段转到onDestroyView时取消此作业,当片段转到onResume时启动此作业!
我写了下面的代码,我可以在onDestroyView中取消,但我不知道如何在onResume中重新开始!
我的编码:
private val bannerJob = CoroutineScope(Main)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
bannerJob.launch {
repeat(REPEAT_TIME) {
delay(DELAY_TIME)
if (autoScrollIndex < list.size) {
autoScrollIndex += 1
} else {
autoScrollIndex = 0
}
binding.list.scrollToPosition(autoScrollIndex)
}
}
}
override fun onDestroyView() {
super.onDestroyView()
bannerJob.cancel()
}
我如何从以前的职位开始onResume?
1条答案
按热度按时间efzxgjgh1#
你混淆了CoroutineScopes和Jobs之间的区别。调用
launch
会启动一个协程,通过返回的Job访问该协程。你什么都没做。您将CoroutineScope命名为“Job”并取消了整个范围。Scope可以运行许多作业,但在您第一次取消它之后就不再运行了。无论如何,已经有一个你应该使用的provide作用域,所以删除声明CoroutineScope属性的行,而使用
viewLifecycle.lifecycleScope.launch
来启动你的协程。如果你使用这个,你的协程将在onViewDestroyed()
中被自动取消。最后,在取消和重新启动协程时,您需要考虑对称性。如果你只在
onViewDestroyed()
中取消协程,那么你应该只在onViewCreated()
中启动它。如果你在onResume()
中重新启动它,那么你可以并行运行它的多个副本,因为在视图被创建和销毁之间,onResume()
可以被多次调用。如果你做应计意味着当你的应用视图被覆盖(弹出对话框或用户切换应用)时停止你的作业,并在你的应用恢复时重新启动它,那么你应该在对称生命周期事件中取消作业到onResume()
,也就是onPause()
。为了能够在
onViewDestroyed
之外的某个时间取消作业,您需要创建Job?
属性,以将从launch
调用返回的作业分配给。然后你可以在onPause()
中调用?.cancel()
。