У меня есть класс, который запускает сопрограммы и позволяет их отменять, когда действие / фрагмент, из которого они вызываются, уничтожается. Однако это не работает, как я ожидал. Когда я выхожу из фрагмента во время выполнения операции, отмена сопрограммы не выполняется, и я получаю NPE при попытке доступа к View
, которого больше не существует.
open class CoroutineLauncher : CoroutineScope {
private val dispatcher: CoroutineDispatcher = Dispatchers.Main
private val supervisorJob = SupervisorJob()
override val coroutineContext: CoroutineContext
get() = dispatcher + supervisorJob
fun launch(action: suspend CoroutineScope.() -> Unit) = launch(block = action)
fun cancelCoroutines() {
supervisorJob.cancelChildren() //coroutineContext.cancelChildren() has same results
}
}
вот использование
class MyFragment : Fragment {
val launcher = CoroutineLauncher()
fun onSomeEvent() {
launcher.launch {
val result = someSuspendFunction()
if (!isActive) return
// CAUSES CRASH
myTextView.text = result.userText
}
}
override fun onDestroyView() {
super.onDestroyView()
launcher.cancelCoroutines()
}
}
Я добавил строки журнала, чтобы гарантировать, что onDestroyView
и cancelCoroutines
оба вызываются перед cra sh. Мне кажется, что мне не хватает чего-то очевидного, но то, что я делаю, похоже, соответствует предложенным здесь рецептам: https://proandroiddev.com/android-coroutine-recipes-33467a4302e9
Есть идеи?