ViewModel очищается при последнем нажатии
Я использую навигационный граф для навигации между фрагментами, и я заметил, что мой viewModel очищается (onCleared) только тогда, когда я нажимаю кнопку возврата, но не когда я перехожу к другому фрагменту с помощью этого кода:
val action = MyFragmentDirections.actionMyFragmentToParentFragment()
val navController = findNavController()
navController.navigate(action)
В журналах я вижу, что вызывается фрагмент onDestroyView(), но onCleared() viewModel не вызывается.
Что мне не хватает?
2 ответа
Платформа поддерживает ViewModel до тех пор, пока существует область действия или фрагмента.ViewModel не уничтожается, если ее владелец уничтожается для изменения конфигурации, например ориентации экрана (в этом случае также вызывается метод onDestroy()). Новый экземпляр владельца повторно подключается к существующему экземпляру ViewModel. Но если мы намеренно хотим завершить действие, то ViewModel очистится. Метод onClear() вызывается перед очисткой.ViewModel также очищается в onBackPress(). Потому что в этом случае мы также намеренно завершаем действие.
Решение:ViewModel очищается, когда -
- onBackPressed вызывается
- метод finish() вызывается
- Активность остановлена системой из-за проблем с памятью.
Объекты ViewModel ограничены жизненным циклом. Они остаются в памяти до тех пор, пока этот объект жизненного цикла не исчезнет навсегда. В случае Действия, когда оно завершено, а в случае Фрагмента, когда оно отсоединено. Дополнительные сведения см. в разделе Обзор ViewModel .
Не видя больше вашего кода, трудно ответить, почему
onCleared
вызывается при обратном нажатии, а не при
Fragment
уничтожен. Однако, если ваш
ViewModel
привязан к
Activity
тогда ответный удар может завершить действие и, следовательно, вызвать вызов onCleared. Делитесь своим кодом, если хотите, чтобы кто-то помог вам копнуть глубже.