我希望协程在切换到其他活动时被取消。即使我切换到下面代码中的其他活动,它也会继续记录日志。
override fun onCreate(savedInstanceState: Bundle?) {
lifecycleScope.launch(Dispatchers.IO) {
while(true) {
delay(5000)
Log.i(TAG, "From lifecyclescope")
}
}
}
我用viewLifecycleOwner
in 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")
}
}
}
}
唯一的区别是,当活动达到停止状态时,协程将被取消。当活动不再可见时,例如当另一个活动出现或当用户最小化您的应用程序时,就会发生这种情况。