android 何时调用视图模型onCleared

vnzz0bqm  于 2022-11-20  发布在  Android
关注(0)|答案(6)|浏览(184)

ViewModel是独立于Activity/片段生命周期,还是仅独立于它们的配置更改。它们何时会停止存在,何时会调用后续的onCleared()方法。是否可以与另一个Activity共享ViewModel?
一种情况:

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

这种分享是可能的吗?这是一种好的做法吗?
此外,由于应用生命周期回调,因此onPause-〉onStop-〉onDestroy对于两者都是相同的
1.活动旋转和
2.当“活动”结束时,
ViewModel如何在内部计算出调用onCleared并最终结束其生命周期的正确时间。

调查结果

  • ViewModel在内部使用holderFragment来保存Activity的示例,并使用setRetainInstance方法(如fragments)来说明配置更改。*

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

omvjsjqw

omvjsjqw1#

ViewModel是独立于活动/片段生命周期还是仅独立于它们的配置更改。
ViewModel(VM)独立于配置更改,并在活动/片段被销毁时被清除。
以下是官方网站上的ViewModel的生命周期:

是否可以与另一个Activity共享viewModel?
您不应该对Activities这样做,但是片段可以使用它们的activity作用域来共享ViewModel,以处理它们之间的通信
ViewModel如何在内部确定调用onCleared并最终结束其生命周期的正确时间?
当应用程序被置于后台并且应用程序进程被终止以释放系统内存时,将调用VM的onCleared
请参阅Android开发人员的帖子ViewModels: Persistence, onSaveInstanceState(), Restoring UI State and Loaders中的“ViewModels是否能持久保存我的数据?"部分

  • 如果您希望用户能够将应用置于后台,然后在三个小时后返回到完全相同的状态,则还应保留数据。这是因为一旦您的Activity进入后台,如果设备内存不足,您的应用进程可能会停止。*

如果应用程序进程和Activity停止,则ViewModel也将被清除。

55ooxyrt

55ooxyrt2#

检查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().
当活动被销毁时,isChangingConfigurations 为false,viewModelStore将被清除。

z0qdvdin

z0qdvdin3#

通过源代码,我们知道ViewModel与HolderFragment绑定。你可以从ViewModelProviders类中的代码中找到它。

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

接下来,您可以找到onDestroy()上类内HolderFragment

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

最后,打开它,

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

现在,也许你已经知道了。2就像上面的图片。3当碎片完成时,它就清除了;当活动重新创建时,将不会调用片段的onDestroy(),因为

public HolderFragment() {
    setRetainInstance(true);
}

希望能对你有所帮助。

svgewumm

svgewumm4#

如果您遵循追踪(检查超类别)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();
                    }
                }
            }
        });
cgfeq70w

cgfeq70w5#

我希望在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()
        }
    }
}
mepcadol

mepcadol6#

执行顺序如下

1.状态已更改()

  1. onResume()/onDestroy()/等等。
    这意味着观察器在完成之前收到了有关挂起状态更改的信息,因此例如onDestroy()方法已完成。

相关问题