AndroidViewModel ve ViewModel


159

Android Mimarlık Bileşenleri kitaplığının tanıtılmasıyla, AndroidViewModelve dahil olmak üzere birkaç yeni sınıf tanıtıldı ViewModel. Ancak, bu iki sınıf arasındaki farkı anlamakta güçlük çekiyorum. Dokümantasyon özlü açıklanır AndroidViewModelaşağıdaki gibidir:

Uygulama içeriği farkında ViewModel

Özlü olmayı takdir ediyorum, ama bu tam olarak ne anlama geliyor? Ne zaman kullanmayı tercih etmelidir AndroidViewModelüzerinde ViewModeltersi ve?

Yanıtlar:


223

AndroidViewModel Uygulama içeriği sağlar

Viewmodel'inizde bağlam kullanmanız gerekiyorsa, uygulama bağlamını içerdiği için AndroidViewModel (AVM) kullanmalısınız. Bağlam çağrısını almak için getApplication(), aksi takdirde normal ViewModel'i (VM) kullanın.

AndroidViewModel uygulama içeriğine sahiptir . Bellek sızıntılarına neden olabileceğinden hepimiz statik bağlam örneğinin kötü olduğunu biliyoruz !! Ancak, statik Uygulama örneğine sahip olmak düşünebileceğiniz kadar kötü değildir, çünkü çalışan uygulamada yalnızca bir Uygulama örneği vardır.

Bu nedenle, Application örneğini belirli bir sınıfta kullanmak ve kullanmak genel bir sorun değildir. Ancak, bir Uygulama örneği bunlara başvuruyorsa, başvuru döngüsü sorunu nedeniyle bir sorundur.

Ayrıca bkz. Uygulama Örneği hakkında

AndroidViewModel Birim testleri için sorunlu

AVM, birim testi için sorunlu olan uygulama bağlamı sağlar. Birim testleri, içerik gibi Android yaşam döngülerinin hiçbiriyle ilgilenmemelidir.


42
Neden her zaman AndroidViewModel kullanmıyorsunuz? daha sonra ihtiyacınız olmasa bile bağlama ihtiyacınız olabilir. Bunun bir dezavantajı var mı?
T. Rex

20
@ T.Rex Eğer koda bakarsanız, ViewModelsadece Uygulama'yı işaret eden bir alanla genişler . Ben buna ihtiyacı yoktur, ben bir zorunlu yapıcı olması gibi yok Application(parametrenin AndroidViewModelgerektirir) ve yerine sadece kullanın ViewModel. Gelecekte bir bağlama ihtiyaç duyduğumda, bunu kolayca değiştirebilirim.
Erkek

3
Kullanın ViewModelEğer Parçası ile veya paylaşımına kullanmak istediğinizde ViewModelaynı Faaliyet farklı fragmanlar arasında.
Codelearner

22
@ T.Rex, bağımlı AndroidViewModelolmaktan bağımsız Contextbir ünite testinde test etmeyi imkansız hale getirerek sadece enstrümantasyon testlerini bir olasılık olarak bıraktı mı? Kendimle oynamadım (henüz), sadece bir düşünce
Konrad Morawski

2
AndroidViewModel ve ViewModel aynı, tek fark AndroidViewModel'in uygulama içeriğini içermesidir. MediaStore'dan veri yükleme işlevini yerine getirmek için ViewModel'i ve bağlamı ViewModel'e geçirmek için kullanabilirsiniz veya uygulama bağlamıyla AndroidViewModel'i kullanabilirsiniz.
Alex

10

Sonunda daha basit bir açıklama aldım, biraz ...... ... AndroidViewModel sınıfı bir ViewModel alt sınıfı ve onlara benzer, onlar UI ile ilgili verileri depolamak ve yönetmek için tasarlanmış veri hazırlamak ve sağlamak için sorumludur UI için ve otomatik olarak yapılandırma değişikliği hayatta verilerin izin.

AndroidViewModel ile tek fark, bir sistem hizmeti almak veya benzer bir gereksinime sahip olmak için içeriğe ihtiyacınız varsa yardımcı olan uygulama bağlamıyla birlikte gelmesidir . kalın metin onu hissetmeyi daha net hale getirir.



4

AndroidViewModel , ViewModel'in alt sınıfıdır . Aralarındaki fark, örneğin Uygulama Deposu'ndaki Veritabanını örneklemek için Uygulama Bağlamı gerektiğinde kullanılabilecek Uygulama Bağlamını geçebilmemizdir.

AndroidViewModel bir Uygulama bağlamı farkında ViewModel olduğunu.

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 uygulamasını yalnızca Uygulama Bağlamı gerektiğinde kullanmalısınız .

ViewModel'de hiçbir zaman bir faaliyet referansı veya bir faaliyete referans veren bir görünüm saklamamalısınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.