Когда отображается 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

enter image description here

Ответ 1

Являются ли ViewModels независимыми от жизненных циклов активности/фрагмента или только от изменений их конфигурации.

Они не зависят от изменений конфигурации и очищаются при разрушении активности/фрагмента.

Ниже приведен жизненный цикл ViewModel с официального сайта:

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();
                    }
                }
            }
        });