web-dev-qa-db-ja.com

AndroidアーキテクチャコンポーネントViewModelコンテキスト

私はアプリにViewModelとLiveDataを実装するためにGoogleのアーキテクチャコンポーネントを研究しており、公式のドキュメントには次のように書かれています:

注:ViewModelは特定のアクティビティおよびフラグメントのインスタンス化よりも長く存続するため、View、またはアクティビティコンテキストへの参照を保持する可能性のあるクラスを参照してはなりません。 ViewModelがアプリケーションコンテキストを必要とする場合(たとえば、システムサービスを見つけるため)、AndroidViewModelクラスを拡張し、コンストラクターでアプリケーションを受け取るコンストラクターを持つことができます(Applicationクラスはコンテキストを拡張するため)。

その後、私はそのようなコードで終わりました:

public class ViewModelTest extends AndroidViewModel {

public ViewModelTest(Application application) {
    super(application);
}

public void test(){
    Prefs.getCurrentCode(getApplication());
}

そして、私はアクティビティで通常それをインスタンス化する必要がありますか?

  val viewModel2 = ViewModelProviders.of(this).get(ViewModelTest::class.Java)
    viewModel2.test()

悪くないですか? SharedPreferencesまたはコンテキストを必要とするものにアクセスする必要があるときにこのアプリケーション変数を使用するには?そうであれば、ViewModelでの使用を避け、ビューでのみ使用する必要がありますか?特に、コンテキストが必要な値でUIコンポーネントを更新したい場合。私はこの問題への取り組み方をちょっと知りません、そして私はどんな提案でも開いています。

前もって感謝します

11
julioribeiro

AndroidViewModelクラスは、Androidのアーキテクチャコンポーネントの一部であるAndroid.Arch.lifecycleパッケージの一部として提供されます。それ自体が、コンストラクターに渡されたアプリケーションコンテキストを呼び出します。アプリケーションコンテキストは、アクティビティライフサイクル全体で有効です。

ViewModelのアプリケーションコンテキストは、アクティビティライフサイクルに関連付けられているアクティビティコンテキストではなく、アプリケーションライフサイクル全体に関連付けられているため、問題ありません。

ViewModelドキュメントは、具体的にはアクティビティコンテキストを使用しないことに言及していますが、問題がなければアプリケーションコンテキストを使用しています。

5
Bamerza