android 如何在Kotlin中启动协程

mu0hgdu0  于 2023-06-04  发布在  Android
关注(0)|答案(1)|浏览(149)

在我的应用程序中,我想使用协程和使用循环乐趣
我希望当片段转到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?

efzxgjgh

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()

相关问题