Когда отображается viewmodel onCleared
Являются ли ViewModels независимыми от жизненных циклов активности/фрагмента или только от изменений их конфигурации. Когда они прекратят свое существование и вызовет последующий метод 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
Ответы
Ответ 1
Являются ли ViewModels независимыми от жизненных циклов активности/фрагмента или только от изменений их конфигурации.
Они не зависят от изменений конфигурации и очищаются при разрушении активности/фрагмента.
Ниже приведен жизненный цикл ViewModel с официального сайта:
Можно ли поделиться viewModel с другим действием?
Вы не должны делать это с деятельностью. Однако фрагменты могут совместно использовать ViewModel
используя свою область действия для обработки связи между ними.
Ответ 2
проверить метод onDestroy() в 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();
}
}
Вариант isChangingConfigurations имеет значение true, когда вращается действие, метод viewModelStore method clear() не вызывается.
Когда Activity уничтожена, isChangingConfigurations имеет значение false, viewModelStore будет очищен.
Ответ 3
Хорошо, из исходного кода мы знаем привязку 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
Если вы идете по следу (проверьте супер класс)
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();
}
}
}
});