取消了协程支持,父RecyclerView无法从子活动更改中更新

时间:2019-02-03 23:26:41

标签: android-studio kotlin android-recyclerview kotlinx.coroutines

我遇到的一种情况是,如果我在上级活动(显示回收站)视图中不取消自己的协程,则在我开始进行子活动时可能会导致崩溃。协程打开一个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还是可以的,我是否有适当的方法来做到这一点?

1 个答案:

答案 0 :(得分:0)

因此,我需要取消任何后台任务,但不关闭协程管理程序本身。

为此,我找到了cancelChildren()调用,如下所示:

@CallSuper
override fun onPause() {
    super.onPause()
    coroutineMarkerSup.cancelChildren()
}

根据我的读物 .cancelChildren(),它关闭了所有后台线程,但保持超级用户处于活动状态。希望这有意义并能帮助某人。 这是link的更多有关cancel children方法的信息。