回答:
Viewmodel内でコンテキストを使用する必要がある場合は、アプリケーションコンテキストが含まれているため、AndroidViewModel(AVM)を使用する必要があります。コンテキスト呼び出しを取得getApplication()
するには、通常のViewModel(VM)を使用します。
AndroidViewModelにはアプリケーションコンテキストがあります。私たちは皆知っている、それがメモリリークを引き起こす可能性として静的コンテキスト・インスタンスを持つことは悪です!ただし、実行中のアプリケーションには1つのアプリケーションインスタンスしかないため、静的なアプリケーションインスタンスがあることは、思っているほど悪くはありません。
したがって、特定のクラスでApplicationインスタンスを使用して持つことは、一般的に問題にはなりません。しかし、アプリケーションインスタンスがそれらを参照する場合、参照サイクルの問題のため、問題になります。
AVMは、ユニットテストに問題のあるアプリケーションコンテキストを提供します。単体テストは、コンテキストなど、Androidのライフサイクルを処理するべきではありません。
ViewModel
Applicationを指すフィールドだけで拡張されています。必要ない場合は、必須のコンストラクターとApplication
パラメーター(必須AndroidViewModel
)を使用するのではなく、単にを使用しますViewModel
。将来コンテキストが必要になったときに、簡単に変更できます。
ViewModel
Fragmentで使用する場合、またはViewModel
同じアクティビティの異なるフラグメント間で共有する場合に使用します。
AndroidViewModel
- Context
依存性がある-可能性として計装テストのみを残して、通常の単体テストでそれをテストすることを不可能にしますか?私は自分でいじっていません(まだ)、それは単なる考えです
最後に、少し簡単な説明を取得しました... ... AndroidViewModelクラスはViewModelのサブクラスであり、それらと同様に、UI関連のデータを格納および管理するように設計されており、データの準備と提供を行いますUIの場合、データが構成の変更に耐えることができます。
AndroidViewModelとの唯一の違いは、アプリケーションコンテキストが付属していることです。これは、システムサービスを取得するためにコンテキストが必要な場合や、同様の要件がある場合に役立ちます。太字のテキストは、それを感知することをより明確にします。
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に保存しないでください。