代码之家  ›  专栏  ›  技术社区  ›  timv

父RecyclerView未从子活动更改中更新,协同程序支持已取消

  •  0
  • timv  · 技术社区  · 6 年前

    我有一种情况,如果我不取消我在我的父母活动(显示一个回收)视图我的协同旅行,它可能会导致一个崩溃,一旦我开始我的孩子的活动。coroutine打开一个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()行,它运行得很好,但是我担心应用程序崩溃。

    1 回复  |  直到 6 年前
        1
  •  0
  •   timv    6 年前

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

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

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

    .cancelChildren() 关闭任何后台线程,但保持主管处于活动状态。希望这是有意义的,能帮助别人。 这是一个 link