何时调用viewModel onCleared

时间:2018-06-22 08:25:16

标签: android android-activity android-lifecycle android-viewmodel

ViewModel是否独立于活动/片段生命周期,还是仅依赖于其配置更改。它们何时将不存在,并随后调用onCleared()方法。 可以与其他Activity共享viewModel吗?

一种情况:

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

这种共享是可行的,还是一种好习惯。

此外,由于应用程序生命周期回调,两个的onPause-> onStop-> onDestroy都是相同的

1。活动旋转和

2。活动结束时,

ViewModel如何在内部确定合适的时间来调用onCleared并最终结束其生命周期。


发现

ViewModel在内部使用了holderFragment来保存活动的实例,并使用setRetainInstance方法(如片段)来说明配置更改。

Source: dive-inside-of-androids-viewmodel-architecture-components

enter image description here

5 个答案:

答案 0 :(得分:5)

  

ViewModel是否独立于活动/片段生命周期,还是   他们的配置发生了变化。

它们独立于配置更改,并在活动/碎片被破坏时清除。

以下是官方网站上的lifecycle of ViewModel

ViewModel

  

viewModel可以与另一个Activity共享吗?

您不应该通过“活动”来做到这一点。但是,片段可以使用其活动范围共享ViewModel来处理它们之间的通信

答案 1 :(得分:1)

好的,抛出源代码,我们知道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);
}

希望它可以帮助您。(希望)

答案 2 :(得分:1)

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

当Activity销毁时, isChangingConfigurations 为false,viewModelStore将被清除。

答案 3 :(得分:0)

如果您遵循这条路线(请检查超级课程) 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();
                    }
                }
            }
        });

答案 4 :(得分:0)

我希望在Activity完成时调用我的VM的onClear。我使用onPause,因为对onDestroy的调用并不总是立即执行的……可能要在onPause之后几秒钟:

class SomeActivity : AppCompatActivity() {

    override fun onPause() {
        super.onPause()

        // viewmodel is not always cleared immediately after all views detach from it, which delays
        // the vm's cleanup code being called, which lets the resources continue running
        // after all UIs detach, which is weird, because I was using timers and media players.
        // this makes the VM execute onCleared when its Activity detaches from it.
        if (isFinishing) {
            viewModelStore.clear()
        }
    }
}