100 votes

Quand le viewmodel onCleared est-il appelé

Sont Viewmodel indépendant de l'activité/fragment de cycle de vie ou tout simplement leurs changements de configuration. Quand vont-ils cesser d'exister et la suite onCleared() la méthode appelée. Peut le viewModel être partagé avec une autre Activité ?

Situation:

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

est ce partage possible et est-ce une bonne pratique.

Aussi, depuis l'application du cycle de vie des rappels, onPause->onStop->onDestroy est de même pour les deux

1.l'activité de rotation et de

2.lorsqu'une Activité se termine,

comment est un ViewModel trouver à l'intérieur le bon moment pour appeler onCleared et enfin la fin de son cycle de vie.


Résultats:

ce Dernier utilise un holderFragment en interne pour tenir une instance de l'activité et utilise le setRetainInstance méthode de fragments pour tenir compte des modifications de configuration.

Source: plongée à l'intérieur d'androïdes-viewmodel-architecture-composants

enter image description here

83voto

Sagar Points 12352

Sont Viewmodel indépendant de l'activité/fragment de cycle de vie ou tout simplement leurs changements de configuration.

Ils sont indépendants des modifications de configuration et sont effacées lorsque l'activité/fragment est détruit.

Voici le cycle de vie du ViewModel à partir du site officiel:

ViewModel

Peut le viewModel être partagé avec une autre Activité ?

Vous ne devriez pas le faire avec des Activités. Cependant, les fragments peuvent partager un ViewModel à l'aide de leur activité à la portée de gérer la communication entre eux

43voto

Eric Y Points 71

vérifier la méthode onDestroy () dans Fragment.java

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

    }
 

La variante isChangingConfigurations est vraie lorsque l'activité tourne, la méthode viewModelStore clear () n'est pas appelée.

Lorsque l'activité est détruite, isChangingConfigurations est faux, le viewModelStore sera effacé.

6voto

Longalei Points 174

ok,le code source,nous savons que le ViewModel se lier avec HolderFragment.vous pouvez à partir du code dans la classe ViewModelProviders pour le trouver.

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

ensuite,dans la classe HolderFragment sur le OnDestroy (), vous pouvez trouver

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

Dernier,de l'ouvrir

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

maintenant ,vous avez peut-être le savoir.tout comme l'image ci-dessus.lorsque le fragment fini,il s'éclaircit; lorsque l'activité de recréer,le fragment de la onDestroy() ne sera pas invoquée,car

public HolderFragment() {
    setRetainInstance(true);
}

l'espoir peut vous aider.

5voto

sajal Points 139

Si vous suivez la piste (Vérifiez la super classe) AppCompatActivity -> FragmentActivity -> ComponentActivity

ComponentActivity observe l'état du cycle de vie.

onDestory () appelle au changement de configuration (comme la rotation de l'écran) mais viewModel n'est pas détruit à cause de la condition suivante.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X