【问题标题】:Parent RecyclerView not updating from Child Activity Change with coroutine support cancelled父 RecyclerView 未从子活动更改更新并取消协程支持
【发布时间】:2025-12-11 22:00:02
【问题描述】:

我有一种情况,如果我不取消我的父活动(显示回收器)视图中的协程,一旦我开始我的子活动,它可能会导致崩溃。协程打开一个 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 是否可以,或者有没有我忽略的正确方法。

【问题讨论】:

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


    【解决方案1】:

    所以我需要取消任何后台任务,但不关闭协程主管本身。

    为此,我发现 cancelChildren() 调用如下:

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

    根据我的阅读 .cancelChildren() 关闭所有后台线程但保持主管处于活动状态。希望这是有道理的,可以帮助某人。 这是一个link 以获取有关取消子项方法的更多信息。

    【讨论】: