web-dev-qa-db-ja.com

onClearedのビューモデルがいつ呼び出されるか

ViewModelは、アクティビティ/フラグメントのライフサイクル、または単に構成の変更に依存しません。それらはいつ存在しなくなり、その後のonCleared()メソッドが呼び出されますか。 viewModelを別のアクティビティと共有できますか?

状況:

Activity1+viewModel1--->(rotation)--->Activity1+viewModel1
--->(launch Intent)--->Activity2+viewModel1

この共有は可能ですか、それは良い習慣ですか?.

また、アプリのライフサイクルコールバックなので、onPause-> onStop-> onDestroyは両方とも同じです

1.アクティビティの回転と

2.アクティビティが終了すると、

viewModelは、onClearedを呼び出して最終的にライフサイクルを終了する適切なタイミングを内部的に把握しています。


調査結果

ViewModelは、holderFragmentを内部で使用してアクティビティのインスタンスを保持し、フラグメントのようなsetRetainInstanceメソッドを使用して構成の変更を考慮します。

ソース:dive-inside-of-androids-viewmodel-architecture-components

enter image description here

41
ir2pid

ViewModelは、アクティビティ/フラグメントのライフサイクル、または単に構成の変更に依存しません。

ViewModel(VM)は構成の変更から独立しており、アクティビティ/フラグメントが破棄されるとクリアされます。

以下は、公式サイトの ViewModelのライフサイクル です。

ViewModel

ViewModelを別のアクティビティと共有できますか?

アクティビティでそれを行うべきではありません。ただし、フラグメントはアクティビティスコープを使用してViewModelを共有し、フラグメント間の通信を処理できます

ViewModelは、onClearedを呼び出して最終的にライフサイクルを終了する適切なタイミングを内部でどのように把握していますか?

VMのonClearedは、アプリがバックグラウンドに置かれたときに呼び出され、システムのメモリを解放するためにアプリプロセスが強制終了されます。

このセクションの ViewModelsはデータを保持しますか? セクションを参照Android開発者の投稿、 ViewModels:Persistence、onSaveInstanceState()、Restoreing UI State and Loaders =

ユーザーがアプリをバックグラウンドに配置して、3時間後にまったく同じ状態に戻ることができるようにしたい場合は、データも保持する必要があります。これは、アクティビティがバックグラウンドになるとすぐに、デバイスのメモリが不足している場合、アプリプロセスを停止できるためです。

アプリのプロセスとアクティビティが停止すると、ViewModelもクリアされます。

19
Sagar

fragment.JavaのメソッドonDestroy()を確認してください

public void onDestroy() {
        this.mCalled = true;
        FragmentActivity activity = this.getActivity();
        boolean isChangingConfigurations = activity != null && activity.isChangingConfigurations();
        if (this.mViewModelStore != null && !isChangingConfigurations) {
            this.mViewModelStore.clear();
        }

    }

バリアントisChangingConfigurationsは、アクティビティが回転するときにtrueになり、viewModelStoreメソッドclear()はtrueにならない呼ばれた。

アクティビティが破棄されると、isChangingConfigurationsがfalseの場合、viewModelStoreはクリアされます。

8
Eric Y

ソースコードを通じて、ViewModelがHolderFragmentにバインドされていることがわかります。クラスViewModelProvidersのコードからそれを見つけることができます。

_@MainThread
public static ViewModelProvider of(@NonNull FragmentActivity activity,
        @NonNull Factory factory) {
    checkApplication(activity);
    return new ViewModelProvider(ViewModelStores.of(activity), factory);
}
_

次に、そのクラスのHolderFragmentがonDestroy()です。

_@Override
public void onDestroy() {
    super.onDestroy();
    mViewModelStore.clear();
}
_

最後に開けて

_public final void clear() {
 for (ViewModel vm : mMap.values()) {
        vm.onCleared();
   }
    mMap.clear();
}
_

今、あなたはそれを知っているかもしれません。上の写真のように。フラグメントが終了すると、クリアされました。アクティビティが再作成されると、フラグメントのonDestroy()は呼び出されません。

_public HolderFragment() {
    setRetainInstance(true);
}
_

お役に立てれば幸いです。

4
Longalei

トレイルをたどる場合(スーパークラスをチェック)AppCompatActivity-> FragmentActivity-> ComponentActivity

ComponentActivityは、ライフサイクルの状態を観察します。

onDestory()は、構成の変更(画面の回転など)時に呼び出しますが、次の条件のため、viewModelは破棄されません。

getLifecycle().addObserver(new GenericLifecycleObserver() {
            @Override
            public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
                if (event == Lifecycle.Event.ON_DESTROY) {
                    if (!isChangingConfigurations()) {
                        getViewModelStore().clear();
                    }
                }
            }
        });
1
sajal