AndroidViewModel vs ViewModel

159

Dengan diperkenalkannya pustaka Komponen Arsitektur Android, beberapa kelas baru diperkenalkan, termasuk AndroidViewModeldan ViewModel. Namun, saya mengalami kesulitan mencari tahu perbedaan antara dua kelas ini. The dokumentasi ringkas menjelaskan AndroidViewModelsebagai berikut:

Konteks aplikasi sadar ViewModel

Saya menghargai singkatnya, tapi apa sebenarnya implikasi ini? Kapan kita harus memilih untuk menggunakan AndroidViewModellebih ViewModeldan sebaliknya?

cascal
sumber

Jawaban:

223

AndroidViewModel menyediakan konteks Aplikasi

Jika Anda perlu menggunakan konteks di dalam Viewmodel Anda, Anda harus menggunakan AndroidViewModel (AVM), karena mengandung konteks aplikasi. Untuk mengambil panggilan konteks getApplication(), jika tidak gunakan ViewModel (VM) biasa.

AndroidViewModel memiliki konteks aplikasi . Kita semua tahu bahwa instance konteks statis adalah jahat karena dapat menyebabkan kebocoran memori !! Namun, memiliki instance Aplikasi statis tidak seburuk yang Anda bayangkan karena hanya ada satu instance Aplikasi dalam aplikasi yang sedang berjalan.

Oleh karena itu, menggunakan dan memiliki instance Aplikasi dalam kelas tertentu tidak menjadi masalah secara umum. Tetapi, jika sebuah instance Aplikasi referensi mereka, itu adalah masalah karena masalah siklus referensi.

Lihat Juga tentang Mesin Virtual Aplikasi

AndroidViewModel Bermasalah untuk pengujian unit

AVM menyediakan konteks aplikasi yang bermasalah untuk pengujian unit. Tes unit tidak boleh berurusan dengan siklus hidup Android mana pun, seperti konteks.

Alex
sumber
42
Mengapa tidak selalu menggunakan AndroidViewModel? Anda nanti mungkin memerlukan konteksnya bahkan jika Anda tidak membutuhkannya sekarang. Apakah ada kerugiannya?
T. Rex
20
@ T.Rex Jika Anda melihat kode, ia meluas ViewModeldengan hanya bidang yang menunjuk ke Aplikasi. Jika saya tidak membutuhkannya, saya tidak suka memiliki konstruktor wajib dengan Applicationparameter (yang AndroidViewModelmembutuhkan) dan hanya menggunakan ViewModel. Ketika saya membutuhkan konteks di masa depan, saya dapat dengan mudah mengubahnya.
Bocah
3
Gunakan ViewModelsaat Anda ingin menggunakannya dengan Fragmen atau untuk berbagi di ViewModelantara fragmen berbeda dari Kegiatan yang sama.
codelearner
22
@ T.Rex tidak akan menggunakan AndroidViewModel- menjadi Context-dependen - membuatnya tidak mungkin untuk mengujinya dalam tes unit biasa, hanya menyisakan tes instrumentasi sebagai suatu kemungkinan? Saya belum bermain-main dengan itu sendiri (belum), itu hanya sebuah pemikiran
Konrad Morawski
2
AndroidViewModel dan ViewModel adalah sama, satu-satunya perbedaan adalah bahwa AndroidViewModel berisi konteks aplikasi. Anda dapat menggunakan menggunakan ViewModel dan untuk meneruskan konteks ke ViewModel untuk berfungsi yang memuat data dari MediaStore, atau menggunakan AndroidViewModel dengan konteks aplikasi.
Alex
10

Akhirnya saya mendapat penjelasan yang lebih sederhana, sedikit ...... ... Kelas AndroidViewModel adalah subkelas dari ViewModel dan mirip dengan mereka, mereka dirancang untuk menyimpan dan mengelola data terkait UI yang bertanggung jawab untuk menyiapkan & menyediakan data untuk UI dan secara otomatis memungkinkan data untuk selamat dari perubahan konfigurasi.

Satu-satunya perbedaan dengan AndroidViewModel adalah ia datang dengan konteks aplikasi, yang sangat membantu jika Anda memerlukan konteks untuk mendapatkan layanan sistem atau memiliki persyaratan yang sama. teks tebal membuatnya lebih jelas untuk merasakannya.

pengguna9830926
sumber
1
sumber resmi media.com/androiddevelopers/…
Neeraj Sewani
4

AndroidViewModel adalah subclass dari ViewModel . Perbedaan di antara mereka adalah kita dapat melewati Konteks Aplikasi yang dapat digunakan setiap kali Konteks Aplikasi diperlukan misalnya untuk instantiate Database di Repositori.

AndroidViewModel adalah aplikasi ViewModel sadar konteks.

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();
}

Anda harus menggunakan AndroidViewModel hanya ketika Anda memerlukan Konteks Aplikasi.

Anda tidak boleh menyimpan referensi aktivitas atau tampilan yang mereferensikan aktivitas di ViewModel. Karena ViewModel dirancang untuk hidup lebih lama dari aktivitas dan itu akan menyebabkan Kebocoran Memori.

John
sumber