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?
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.
AVM menyediakan konteks aplikasi yang bermasalah untuk pengujian unit. Tes unit tidak boleh berurusan dengan siklus hidup Android mana pun, seperti konteks.
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.
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.
ViewModel
dengan hanya bidang yang menunjuk ke Aplikasi. Jika saya tidak membutuhkannya, saya tidak suka memiliki konstruktor wajib denganApplication
parameter (yangAndroidViewModel
membutuhkan) dan hanya menggunakanViewModel
. Ketika saya membutuhkan konteks di masa depan, saya dapat dengan mudah mengubahnya.ViewModel
saat Anda ingin menggunakannya dengan Fragmen atau untuk berbagi diViewModel
antara fragmen berbeda dari Kegiatan yang sama.AndroidViewModel
- menjadiContext
-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 pemikiranAkhirnya 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.
sumber
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:
ViewModel:
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.
sumber