Les ViewModels sont-ils indépendants des cycles de vie des activités/fragments ou uniquement de leurs modifications de configuration. Quand cesseront-ils d'exister et la méthode onCleared () suivante sera-t-elle appelée? Le viewModel peut-il être partagé avec une autre activité?
Une situation:
Activity1+viewModel1--->(rotation)--->Activity1+viewModel1
--->(launch Intent)--->Activity2+viewModel1
ce partage est-il possible et est-ce une bonne pratique.
De plus, puisque les rappels du cycle de vie de l'application, onPause-> onStop-> onDestroy est le même pour les deux
1. activité en rotation et
2.quand une activité se termine,
comment un ViewModel détermine-t-il en interne le bon moment pour appeler onCleared et enfin mettre fin à son cycle de vie.
Constatations :
le ViewModel utilise un holderFragment en interne pour contenir une instance de l'activité et utilise la méthode setRetainInstance comme des fragments pour tenir compte des changements de configuration.
Source: composants-architecture-plongée-à-l'intérieur-d'androids-viewmodel
Les ViewModels sont-ils indépendants des cycles de vie des activités/fragments ou uniquement de leurs modifications de configuration.
Les ViewModels (VM) sont indépendants des changements de configuration et sont effacés lorsque l'activité/le fragment est détruit.
Voici le cycle de vie de ViewModel du site officiel:
Le viewModel peut-il être partagé avec une autre activité?
Vous ne devriez pas faire ça avec les activités. Cependant, les fragments peuvent partager un ViewModel
en utilisant leur étendue d'activité pour gérer la communication entre eux
Comment un ViewModel trouve-t-il en interne le bon moment pour appeler
onCleared
et enfin mettre fin à son cycle de vie?
Le onCleared
d'une VM est appelé lorsque l'application est mise en arrière-plan et que le processus de l'application est tué afin de libérer de la mémoire du système.
Voir la section Les ViewModels conservent-ils mes données? de ce Android Message du développeur, ViewModels: Persistence, onSaveInstanceState (), Restauration de l'état de l'interface utilisateur et des chargeurs =
Si vous souhaitez que l'utilisateur puisse mettre l'application en arrière-plan, puis revenir trois heures plus tard au même état exact, vous devez également conserver les données. En effet, dès que votre activité passe en arrière-plan, le processus de votre application peut être arrêté si l'appareil manque de mémoire.
Si le processus et l'activité de l'application sont arrêtés, le ViewModel sera également effacé.
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 viewModelStoreclear () n'est pas appelé.
Lorsque l'activité est détruite, isChangingConfigurations est false, le viewModelStore sera effacé.
Grâce au code source, nous savons que le ViewModel se lie avec HolderFragment. vous pouvez à partir du code de la classe ViewModelProviders le trouver.
@MainThread
public static ViewModelProvider of(@NonNull FragmentActivity activity,
@NonNull Factory factory) {
checkApplication(activity);
return new ViewModelProvider(ViewModelStores.of(activity), factory);
}
ensuite, HolderFragment en classe sur son onDestroy()
vous pouvez trouver
@Override
public void onDestroy() {
super.onDestroy();
mViewModelStore.clear();
}
Enfin, ouvrez-le,
public final void clear() {
for (ViewModel vm : mMap.values()) {
vm.onCleared();
}
mMap.clear();
}
maintenant, peut-être que vous le savez. tout comme l'image ci-dessus. Quand le fragment a fini, il s'est dégagé; lorsque l'activité est recréée, onDestroy () du fragment ne sera pas invoqué, car
public HolderFragment() {
setRetainInstance(true);
}
espérons que cela peut vous aider.
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();
}
}
}
});