我遇到的一种情况是,如果我在上级活动(显示回收站)视图中不取消自己的协程,则在我开始进行子活动时可能会导致崩溃。协程打开一个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还是可以的,我是否有适当的方法来做到这一点?
答案 0 :(得分:0)
因此,我需要取消任何后台任务,但不关闭协程管理程序本身。
为此,我找到了cancelChildren()调用,如下所示:
@CallSuper
override fun onPause() {
super.onPause()
coroutineMarkerSup.cancelChildren()
}
根据我的读物 .cancelChildren(),它关闭了所有后台线程,但保持超级用户处于活动状态。希望这有意义并能帮助某人。 这是link的更多有关cancel children方法的信息。