Родительский RecyclerView не обновляется из Child Activity Change с отменой поддержки сопрограмм - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть ситуация, когда если я не отменю свою сопрограмму в представлении родительского действия (которое отображает переработчик), это может привести к сбою после запуска дочернего действия.Сопрограмма открывает базу данных SQL и получает данные для повторного просмотра.Я реализую это следующим образом:

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()
}

Если я вернусь еще к одному действию к родительскому элементу родителя и снова перейду, представление перезапуска отобразит обновленное содержимое.

Итак, чтобы обойти проблему, я закомментировал строку coroutineMarkerSup.cancel ()в onPause (), и он работает нормально, но затем меня беспокоит сбой приложения.

Так нормально ли не отменять coroutineMarkerSup или есть правильный способ сделать это, который я пропустил.

1 Ответ

0 голосов
/ 06 февраля 2019

Поэтому мне нужно отменить любые фоновые задачи, но не закрывать сам супервизор сопрограмм.

Для этого я нашел вызов cancelChildren () следующим образом:

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

Из моегочтение .cancelChildren () закрывает все фоновые потоки, но поддерживает супервизор активным.Надеюсь, что это имеет смысл и помогает кому-то.Вот ссылка на дополнительную информацию о методе отмены детей.

...