В чем разница между AndroidViewModel и ViewModel в компонентах архитектуры Android?

Некоторое время я работал над компонентами архитектуры Android, которые были представлены в Google IO 2017.

Один из их компонентов, чтобы избежать проблем с изменением конфигурации, они предоставляют классы ViewModel и AndroidViewModel

Согласно документу:

AndroidViewModel: приложение с учетом контекста ViewModel

ViewModel: ViewModels также можно использовать в качестве уровня связи между различными фрагментами действия. Каждый фрагмент может получить ViewModel, используя один и тот же ключ через свою активность.

Но для сценария AndoirdViewModel я могу получить контекст приложения, расширив класс до класса приложения.

В чем реальная разница между ними в разработке Android? Потому что оба привязаны только к жизненному циклу Activity/Fragment.


person Burhanuddin Rashid    schedule 13.10.2017    source источник
comment
вы задаете 2 вопроса в одном и том же вопросе, я считаю, что вы можете переключить заголовок и сфокусировать его на том, зачем использовать AndroidViewModel вместо расширения приложения. Ответ, который дал @CommonsWare, все еще действителен. Таким образом, вы можете попросить удалить повторяющийся тег, потому что создайте новый вопрос для хорошего ответа... Я не думаю, что это хорошая идея.   -  person MiguelHincapieC    schedule 26.01.2018


Ответы (1)


Но для сценария AndoirdViewModel я могу получить контекст приложения, расширив класс до класса приложения.

Создание собственного пользовательского подкласса Application не делает этот единственный экземпляр волшебным образом доступным для класса ViewModel.

Можно создать пользовательский подкласс Application, который имеет свой собственный метод getInstance() или что-то еще, чтобы напрямую выставить синглтон. Google не нравится этот шаблон (и мне тоже, если уж на то пошло), поэтому Google не направляет разработчиков на его использование.

В чем реальная разница между ними в разработке Android?

ViewModel сам по себе не имеет хорошего способа получить Context. AndroidViewModel предоставляет Application для использования в качестве Context и, в частности, предоставляет синглтон Application, поэтому мы уверены, что сам Context не представляет собой утечку памяти.

person CommonsWare    schedule 13.10.2017
comment
Из любопытства, почему Google (или вам) не нравится подкласс Application с getInstance() ? - person neteinstein; 13.06.2018
comment
@neteinstein: я не могу говорить за Google. Я не фанат, так как это делает использование Application слишком простым, и часто Application является неправильным типом Context для использования. - person CommonsWare; 14.06.2018