У меня есть ситуация, когда если я не отменю свою сопрограмму в представлении родительского действия (которое отображает переработчик), это может привести к сбою после запуска дочернего действия.Сопрограмма открывает базу данных 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 или есть правильный способ сделать это, который я пропустил.