AndroidViewModelとViewModel


158

Androidアーキテクチャコンポーネントライブラリの導入に伴い、AndroidViewModelおよびを含むいくつかの新しいクラスが導入されましたViewModel。しかし、これら2つのクラスの違いを理解するのに苦労しています。ドキュメントは簡潔に説明しAndroidViewModel、次のように:

アプリケーションコンテキスト対応 ViewModel

簡潔に感謝しますが、これは正確に何を意味していますか?いつ使用AndroidViewModelするViewModelか、その逆かを選択する必要があるのはいつですか?

回答:


223

AndroidViewModelはアプリケーションコンテキストを提供します

Viewmodel内でコンテキストを使用する必要がある場合は、アプリケーションコンテキストが含まれているため、AndroidViewModel(AVM)を使用する必要があります。コンテキスト呼び出しを取得getApplication()するには、通常のViewModel(VM)を使用します。

AndroidViewModelにはアプリケーションコンテキストがあります。私たちは皆知っている、それがメモリリークを引き起こす可能性として静的コンテキスト・インスタンスを持つことは悪です!ただし、実行中のアプリケーションには1つのアプリケーションインスタンスしかないため、静的なアプリケーションインスタンスがあることは、思っているほど悪くはありません

したがって、特定のクラスでApplicationインスタンスを使用して持つことは、一般的に問題にはなりません。しかし、アプリケーションインスタンスがそれらを参照する場合、参照サイクルの問題のため、問題になります。

アプリケーションインスタンスについても参照

単体テストに問題のあるAndroidViewModel

AVMは、ユニットテストに問題のあるアプリケーションコンテキストを提供します。単体テストは、コンテキストなど、Androidのライフサイクルを処理するべきではありません。


40
では、なぜ常にAndroidViewModelを使用しないのですか?今は必要ない場合でも、後でコンテキストが必要になる場合があります。それには何か欠点がありますか?
T.レックス

19
@ T.Rexコードを見ると、ViewModelApplicationを指すフィールドだけで拡張されています。必要ない場合は、必須のコンストラクターとApplicationパラメーター(必須AndroidViewModel)を使用するのではなく、単にを使用しますViewModel。将来コンテキストが必要になったときに、簡単に変更できます。
ボーイ

3
ViewModelFragmentで使用する場合、またはViewModel同じアクティビティの異なるフラグメント間で共有する場合に使用します。
codelearner 2018年

22
@ T.Rexは使用しないAndroidViewModel- Context依存性がある-可能性として計装テストのみを残して、通常の単体テストでそれをテストすることを不可能にしますか?私は自分でいじっていません(まだ)、それは単なる考えです
Konrad Morawski

2
AndroidViewModelとViewModelは同じですが、唯一の違いは、AndroidViewModelにアプリケーションコンテキストが含まれていることです。ViewModelを使用してコンテキストをViewModelに渡し、MediaStoreからのデータのロードを機能させるか、アプリケーションコンテキストでAndroidViewModelを使用できます。
Alex

10

最後に、少し簡単な説明を取得しました... ... AndroidViewModelクラスはViewModelのサブクラスであり、それらと同様に、UI関連のデータを格納および管理するように設計されており、データの準備と提供を行いますUIの場合、データが構成の変更に耐えることができます。

AndroidViewModelとの唯一の違いは、アプリケーションコンテキストが付属していることです。これは、システムサービスを取得するためにコンテキストが必要な場合や、同様の要件がある場合に役立ちます。太字のテキストは、それを感知することをより明確にします。



4

AndroidViewModelViewModelのサブクラスです。それらの違いは、アプリケーションコンテキストを渡すことができることです。たとえば、リポジトリでデータベースをインスタンス化するためにアプリケーションコンテキストが必要なときにいつでも使用できます。

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に保存しないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.