Верно. Запуск длительной сопрограммы отовсюду сохранит объекты, на которые она ссылается, до ее завершения или отмены.
Вот почему рекомендуется использовать viewModelScope
внутри ViewModel
и lifecycleScope
в действиях и фрагментах. Потому что они знают, как отменить эти задания.
https://developer.android.com/topic/libraries/architecture/coroutines
Но если вы не ссылаетесь на свое действие или контекст (который на самом деле является самим действием), они не протечет.
CoroutineScope(SupervisorJob())
.launch {
// activity.getString(R.string.something) // Memory leak!
applicationContext.getString(R.string.something) // Memory leak on applicationContext but not on activity. That's fine.
}
. . .
}
По крайней мере, так я ожидал, что это будет работать. Но, кажется, происходит неожиданное поведение, когда вы делаете там withContext(NonCancellable)
. См. https://github.com/Kotlin/kotlinx.coroutines/issues/1061.
Короче говоря, напишите это так, чтобы не было ссылок на Activity
и другие объекты, которые ссылаются на Activity
, что является хорошей практикой. В противном случае ожидайте утечки. Я бы сказал то же самое, если вы ссылаетесь на любые viewmodel
объекты внутри сопрограммы.