我有一个情况,如果我不取消我的父母我的活动协程(也显示回收)查看它可能潜在地导致崩溃一旦我开始我的孩子的活动。该协同程序打开一个SQL数据库,得到的数据为recyclerview。我实现它,如下所示:
protected val coroutineMarkerSup = SupervisorJob()
protected val myMarkerSQLScope = CoroutineScope(Dispatchers.Main + coroutineMarkerSup)
fun doSomething() {
myMarkerSQLScope.launch {
val user = withContext(Dispatchers.IO){
doSomehingInTheBackGround()//gets the SQL database
}
//Any code here is blocked till doSomethingInTheBackGround is finished
finalTaskOnceCoroutineFinished()
}
}
fun finalTaskOnceCoroutineFinished() {
//recyclerView.adapter = adapter
adapter.notifyDataSetChanged()//refresh recyclerview
}
@CallSuper
override fun onPause() {
super.onPause()
coroutineMarkerSup.cancel()
}
然后,一旦我已在孩子活动的变化会影响到母公司的活动我重新启动协程父活动如下。
override fun onRestart() {
super.onRestart()
coroutineMarkerSup.start()
doSomething()
}
如果我回去多了一个活动于母公司的母公司,并再次转发,回收商视图显示更新的内容。
因此,要解决我的onPause()注释掉coroutineMarkerSup.cancel()线的问题,它工作正常,但后来我关注的应用程序崩溃。
因此,它是确定不取消coroutineMarkerSup还是有做到这一点,我已经忽略了一个正确的方法。
所以,我需要取消任何后台任务,但不关闭该协程主管本身。
要做到这一点,我发现cancelChildren()调用如下:
@CallSuper
override fun onPause() {
super.onPause()
coroutineMarkerSup.cancelChildren()
}
从我读.cancelChildren()关闭所有后台线程,但保持活跃监督员。希望这是有道理的,帮助别人。这里是一个link对取消孩子的方法的详细信息。