web-dev-qa-db-ja.com

ViewModelはアクティビティを保存して復元しますか?

新しいViewModelクラスのインスタンスは、次の方法で使用した場合、構成の変更に耐えることができます。

mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);

ただし、構成の変更に加えて、アプリケーション全体のプロセスが強制終了された場合の保存と復元のシナリオもあります。

ViewModel内のフィールドの値は、保存/復元シナリオ中に保持されますか?


編集:この質問への回答に基づいて、私はこの記事を書きました: Android ViewModelアーキテクチャコンポーネントは危険です

14
Vasiliy

ViewModelProvider ドキュメント(getメソッドを確認)によると、アプリのプロセスが強制終了された場合、ViewModelは保持されません。

作成されたViewModelは指定されたスコープに関連付けられており、スコープが有効である限り保持されます(たとえば、アクティビティである場合、終了するかプロセスが強制終了されるまで)

さらに、同様の質問に対するイアンレイクの回答を確認してください: https://medium.com/@ianhlake/you-are-correct-the-viewmodel-is-destroyed-if-your-process-is-killed-by -Android-ef611fcd51e6

正解です。Androidによってプロセスが強制終了されると、ViewModelは破棄されます。以前と同じように、onSaveInstanceState()を使用して、後で同じ状態でアクティビティを再作成する必要があるデータを保存する必要があります。

Android ViewModel Architecture Component is Dangerous もお勧めします。

14
Ziem

Googleがこれに対するソリューションを提供しているようです

ViewModelの保存された状態モジュール

UIステートは通常、アクティビティではなくViewModelオブジェクトに格納または参照されます。そのため、onSaveInstanceState()を使用するには、このモジュールで処理できるボイラープレートが必要です。

モジュールが設定されると、ViewModelオブジェクトはそのコンストラクタを介してSavedStateHandleオブジェクトを受け取ります。これは、保存された状態へのオブジェクトの書き込みと保存された状態からのオブジェクトの取得を可能にするキー値マップです。これらの値は、プロセスがシステムによって強制終了された後も存続し、同じオブジェクトを介して引き続き使用できます。


セットアップ

implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-rc02'(2019年11月7日)


使用法

SavedStateHandleを受け取るようにViewModelを設定するには、AbstractSavedStateVMFactoryを拡張するファクトリを使用してそれらを作成する必要があります。

SavedStateViewModel vm = new ViewModelProvider(this, new SavedStateVMFactory(this))
        .get(SavedStateViewModel.class);

その後、ViewModelはSavedStateHandleを受け取るコンストラクターを持つことができます。


public class SavedStateViewModel extends ViewModel {
    private SavedStateHandle mState;

    public SavedStateViewModel(SavedStateHandle savedStateHandle) {
        mState = savedStateHandle;
    }
    ...
}

値の保存と取得

SavedStateHandle クラスには、Key-Valueマップに必要なメソッドがあります。

  • get(文字列キー)
  • contains(文字列キー)
  • remove(文字列キー)
  • set(文字列キー、T値)
  • keys()
1
pumnao