新しいViewModel
クラスのインスタンスは、次の方法で使用した場合、構成の変更に耐えることができます。
mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
ただし、構成の変更に加えて、アプリケーション全体のプロセスが強制終了された場合の保存と復元のシナリオもあります。
ViewModel
内のフィールドの値は、保存/復元シナリオ中に保持されますか?
編集:この質問への回答に基づいて、私はこの記事を書きました: Android ViewModelアーキテクチャコンポーネントは危険です
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 もお勧めします。
Googleがこれに対するソリューションを提供しているようです
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()