Со ссылкой на класс android.arch.lifecycle.ViewModel
.
ViewModel
относится к жизненному циклу компонента пользовательского интерфейса, к которому он относится, поэтому в приложении Fragment
-based это будет жизненный цикл фрагмента. Это хорошая вещь.
В некоторых случаях требуется разделить экземпляр ViewModel
между несколькими фрагментами. В частности, меня интересует случай, когда многие экраны относятся к одним и тем же базовым данным.
(Документы предлагают аналогичный подход, когда несколько связанных фрагментов отображаются на одном экране, но это можно обойти, используя один фрагмент хоста в соответствии с ответом ниже.)
Это обсуждается в официальной документации ViewModel:
ViewModels также можно использовать в качестве уровня связи между различными фрагментами действия. Каждый фрагмент может получить ViewModel, используя тот же ключ через свою активность. Это позволяет осуществлять связь между фрагментами в разобщенном виде, так что им никогда не нужно напрямую общаться с другим фрагментом.
Другими словами, для обмена информацией между фрагментами, представляющими разные экраны, модель ViewModel
должна быть ограничена жизненным циклом Activity
(и в соответствии с документацией для Android это также может использоваться в других общих экземплярах).
Теперь в новом шаблоне навигации Jetpack рекомендуется использовать архитектуру "Один вид деятельности/Много фрагментов". Это означает, что действие длится все время использования приложения.
т.е. любые совместно используемые экземпляры ViewModel
, ограниченные жизненным циклом Activity
, никогда не будут очищены - память остается в постоянном использовании.
С целью сохранения памяти и использования всего необходимого в любой момент времени было бы неплохо иметь возможность очищать общие экземпляры ViewModel
когда они больше не нужны.
Как можно вручную очистить ViewModel
от его ViewModelStore
или фрагмента держателя?