AndroidViewModel проти ViewModel


158

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

Відомо про контекст програми ViewModel

Я ціную стислість, але що саме це означає? Коли ми маємо обрати для використання AndroidViewModelбільше ViewModelі навпаки?

Відповіді:


223

AndroidViewModel забезпечує контекст програми

Якщо вам потрібно використовувати контекст у своїй Viewmodel, ви повинні використовувати AndroidViewModel (AVM), оскільки він містить контекст програми. Щоб отримати контекстний виклик getApplication(), в іншому випадку використовуйте звичайний ViewModel (VM).

AndroidViewModel має контекст програми . Ми всі знаємо, що статичний екземпляр контексту - це зло, оскільки це може спричинити витік пам'яті !! Однак статичний екземпляр Application не такий вже й поганий, як ви могли б подумати, оскільки в запущеній програмі є лише один екземпляр Application.

Тому використання та наявність екземпляра Application у певному класі взагалі не є проблемою. Але, якщо екземпляр програми посилається на них, це проблема через проблему циклу опорного циклу.

Дивіться також про інстанцію програми

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

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


40
Чому б не завжди використовувати AndroidViewModel? пізніше вам може знадобитися контекст, навіть якщо він вам зараз не потрібен. Чи є якийсь недолік у цьому?
Т. Рекс

19
@ T.Rex Якщо ви подивитеся на код, він поширюється ViewModelлише на поле, що вказує на Application. Якщо мені це не потрібно, мені не подобається мати обов'язковий конструктор з Applicationпараметром (який AndroidViewModelвимагає), а просто використовувати ViewModel. Коли мені потрібен контекст у майбутньому, я можу легко його змінити тоді.
Хлопчик

3
Використовуйте, ViewModelколи ви хочете використовувати його з Fragment або ділитися ViewModelміж різними фрагментами однієї діяльності.
codelearner

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

2
AndroidViewModel і ViewModel однакові, різниця полягає лише в тому, що AndroidViewModel містить контекст програми. Ви можете використовувати UseModel і передавати контекст ViewModel для функціонування завантаження даних з MediaStore або використовувати AndroidViewModel з контекстом програми.
Алекс

9

Нарешті я отримав щось більш просте пояснення, трохи ...... ... Клас 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.