Как правило, когда дело доходит до сохранения ссылки на context
или других объектов, которые имеют жесткие ссылки на context
(например, ContextWrapper
, откуда берется SharedPrefferences
), одинследует относиться к сопрограммам так же, как к классическим нитям.
Например, живая сопрограмма с Dispathers.IO
потенциально может пропустить context
точно так же, как классические thread
, AsyncTasks
и т. Д. Поэтому управление этимиссылки и их очистка являются обязанностью разработчиков.
Оглядываясь назад на ваш код, ваша база ViewModel
работает с IO
scope, что означает любой пустой конструктор luanch
es, создающий дочерний элементсфера на том же Dispatcher
, т.е. IO
. Однако из-за вашего ViewModel.onCleared()
:
override fun onCleared() {
super.onCleared()
job.cancel()
}
вы в значительной степени в безопасности.
Почему я говорю "в значительной степени"?
Потому что это зависит от того, как вы реализуете launch
es. Помните, что только отмена job
не обязательно означает, что соответствующая сопрограмма близка и все ссылки удалены. В некоторых реализациях требуется, чтобы вы непосредственно проверяли состояние своей работы внутри области и выполняли ручную очистку:
Например, если вы создаете цикл while внутри сопрограммы, job.cancel()
не прерывает его , вам нужно break
сделать это вручную.
Оглядываясь в последний раз на свой код, вы ничего не делаете внутри вашего launch
, что требует ручной очистки. Тогда мы можем сказать, что ваш текущий код определенно не пропустит context
.