AndroidViewModel против ViewModel


159

С появлением библиотеки компонентов архитектуры Android появилось несколько новых классов, в том числе AndroidViewModelи ViewModel. Однако у меня возникли проблемы с выяснением различий между этими двумя классами. Документация кратко описывается AndroidViewModelследующим образом :

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

Я ценю краткость, но что именно это означает? Когда мы должны использовать AndroidViewModelснова ViewModelи наоборот?

Ответы:


223

AndroidViewModel предоставляет контекст приложения

Если вам нужно использовать контекст внутри вашей Viewmodel, вы должны использовать AndroidViewModel (AVM), потому что он содержит контекст приложения. Чтобы получить контекстный вызов getApplication(), в противном случае используйте обычную ViewModel (VM).

AndroidViewModel имеет контекст приложения . Мы все знаем, что наличие статического контекста является злом, так как может вызвать утечку памяти !! Однако наличие статического экземпляра приложения не так плохо, как можно подумать, поскольку в запущенном приложении есть только один экземпляр приложения.

Следовательно, использование и наличие экземпляра Application в определенном классе не является проблемой в целом. Но если экземпляр приложения ссылается на них, это проблема из-за проблемы ссылочного цикла.

Смотрите также об экземпляре приложения

AndroidViewModel Проблематично для юнит-тестов

AVM предоставляет контекст приложения, который проблематичен для модульного тестирования. Модульные тесты не должны иметь дело с каким-либо жизненным циклом Android, таким как контекст.


42
Почему бы не всегда использовать AndroidViewModel тогда? позже вам может понадобиться контекст, даже если он вам сейчас не нужен. Есть ли у этого недостаток?
Т. Рекс

20
@ T.Rex Если вы посмотрите на код, он расширяется ViewModelтолько полем, указывающим на приложение. Если мне это не нужно, мне не нравится иметь обязательный конструктор с Applicationпараметром (который AndroidViewModelтребует), а просто использовать ViewModel. Когда мне понадобится контекст в будущем, я легко смогу его изменить.
Мальчик

3
Используйте, ViewModelесли вы хотите использовать его с фрагментом или для разделения ViewModelмежду различными фрагментами одного и того же действия.
codelearner

22
@ T.Rex не использовал бы AndroidViewModel- будучи Contextзависимым - не лишал бы возможности его тестировать в обычном модульном тестировании, оставляя в качестве возможности только инструментальные тесты? Я не играл с ним сам (пока), это всего лишь мысль
Конрад Моравский

2
AndroidViewModel и ViewModel одинаковы, единственное отличие состоит в том, что AndroidViewModel содержит контекст приложения. Вы можете использовать ViewModel и передавать контекст в ViewModel для функции загрузки данных из MediaStore или использовать AndroidViewModel с контекстом приложения.
Алекс

10

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

Единственное отличие от AndroidViewModel заключается в том, что он поставляется с контекстом приложения, что полезно, если вам требуется контекст для получения системного сервиса или аналогичные требования. жирный текст делает его более понятным.


1
официальный источник medium.com/androiddevelopers/…
Neeraj Sewani

4

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

AndroidViewModel - это контекстно- зависимая ViewModel приложения.

AndroidViewModel:

public class PriceViewModel extends AndroidViewModel {
private PriceRepository priceRepository;

public PriceViewModel(@NonNull Application application) {
    super(application);
    priceRepository= new PriceRepository(application);
    allPrices = priceRepository.getAllPrices();
}

ViewModel:

public class PriceViewModel extends ViewModel {
public PriceViewModel() {
    super();
}

Вы должны использовать AndroidViewModel только тогда, когда вам требуется контекст приложения.

Никогда не следует хранить ссылку на действие или представление, которое ссылается на действие, во ViewModel. Потому что ViewModel предназначен для того, чтобы пережить действие и вызвать утечку памяти.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.