当交换到另一个活动时,协程不会被取消



我希望协程在切换到其他活动时被取消。即使我切换到下面代码中的其他活动,它也会继续记录日志。

override fun onCreate(savedInstanceState: Bundle?) {
lifecycleScope.launch(Dispatchers.IO) {
while(true) {
delay(5000)
Log.i(TAG, "From lifecyclescope")
}
}
}

我用viewLifecycleOwnerin fragment轻松解决了上述问题。当它转到另一个片段时,它停止提供日志。我如何在活动中做到这一点?

可以在onPause

中设置
var job: Job? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

job = lifecycleScope.launch(Dispatchers.IO) {
while(true) {
delay(5000)
Log.i("TAG", "From lifecyclescope")
}
}

在onPause

override fun onPause() {
job?.cancel()
super.onPause()
}

有一种简单的方法可以通过使用repeatOnLifecycle实现类似的行为:

override fun onCreate(savedInstanceState: Bundle?) {
lifecycleScope.launch(Dispatchers.IO) {
repeatOnLifecycle(Lifecycle.State.STARTED) {
while(true) {
delay(5000)
Log.i(TAG, "From lifecyclescope")
}
}
}
}

唯一的区别是,当活动达到停止状态时,协程将被取消。当活动不再可见时,例如当另一个活动出现或当用户最小化您的应用程序时,就会发生这种情况。

最新更新