当前位置: 首页 > 知识库问答 >
问题:

何时调用viewmodel onCleared

林鹭洋
2023-03-14

ViewModels是独立于activity/片段生命周期还是仅仅独立于其配置更改。它们何时将不再存在,随后的onCleared()方法将被调用。viewModel可以与另一个activity共享吗?

一种情况:

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

这种分享是否可能,是否是一种好的做法。

此外,由于应用程序生命周期回调,onpause->onstop->ondestroy对这两个程序都是相同的

1.activity旋转和

2.activity结束时,

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

调查结果:

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

来源:dive-inside-of-androids-viewmodel-architecture-components

共有2个答案

澹台季萌
2023-03-14

检查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当activity旋转时,viewModelStore方法clear()不会被调用。

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

臧俊杰
2023-03-14

ViewModels是独立于activity/片段生命周期还是仅仅独立于其配置更改。

视图模型(ViewModels,VMs)与配置更改无关,并且在activity/片段被销毁时被清除。

以下是来自官方站点的ViewModel的生命周期:

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

你不应该对活动那样做。但是,片段可以共享viewmodel使用它们的activity作用域来处理它们之间的通信

ViewModel如何在内部确定调用oncleared并最终结束其生命周期的正确时间?

当应用程序被放入后台并且应用程序进程被终止以释放系统内存时,将调用VM的oncleared

查看ViewModels是否持久化我的数据?这篇Android开发人员文章中的ViewModels:Persistence、onSaveInstanceState()、Restoring UI State和Loader

如果您希望用户能够将应用程序放到后台,然后在三个小时后返回到完全相同的状态,那么您还应该持久化数据。这是因为一旦你的activity进入后台,如果设备内存不足,你的应用程序进程就可以停止。

如果停止应用程序进程和activity,那么ViewModel也将被清除。

 类似资料:
  • 问题内容: 什么时候 叫?我有一个活动,需要在调用onMeasure之后执行一项操作。 我的问题与此处未回答的问题相同。在查看文档指出onMeasure当被称为requestLayout()被调用时,它显然是对自身视图调用时它认为是不能再目前的范围内配合。 但是,这不能告诉我何时我的活动可以假设我的视图已被测量。我已使用此代码将ImageView扩展为TouchImageView。建议在这里使用o

  • 在什么情况下会调用applicationWillTerminate?例如,如果代码中出现崩溃,是否会调用它? 苹果的doc对此语焉不详,它只说当系统出于某种原因需要终止它的时候。 对于不支持后台执行或针对iOS3.x或更早版本链接的应用程序,当用户退出应用程序时,总是调用此方法。对于支持后台执行的app,用户退出app时一般不会调用此方法,因为在那种情况下app只是移动到后台。但在app在后台运行

  • Q1。我的理解是。但是超时场景呢? Q2。在哪里检查完整未来的默认超时设置?如何更改它?未来超时后会发生什么?(完成还是异常?) Q3。只要未来“完成”(完成或超时或任何最后阶段),我就需要。是否有保证在未来“完成”后调用的方法?我应该把放在哪里? 从新到完整的未来。更喜欢用Java8回答。谢谢你的帮助。

  • 我的问题可以是如何使用RXJava2的CompositeDisposable的重复?但要求再澄清一个疑点。根据接受的答案 在我的例子中,我使用片段作为我的视图(MVP中的视图层),在某些情况下,我将活动片段添加到backstack,这实际上不会杀死片段,而只是杀死它的视图。这意味着只调用而不调用。稍后,我可以回到后面堆栈中的相同片段,所以只有它的视图被重新创建。我有一个作为我的的成员,它保存订阅。

  • 问题内容: 现在,我使用一个静态布尔值来告诉初始化何时发生。有没有更简单的方法知道我已经调用了initialize? 谢谢!!! 解决了!!!!非常感谢您的评论。您需要在扩展应用程序的类中初始化解析,然后将其作为应用程序(而不是其他活动)添加到清单文件中。 :) 这是我使用Parse的课程: 这是我的android清单文件 问题答案: 创建一个应用程序类,然后在onCreate中初始化解析。 在此

  • 问题内容: 当消化周期正在发生的事情,我很困惑,是基于每50ms定时器它定期调用(因为它说,在这里,并暗示在这里,或者它的每一个进入的角度范围内(因为它说,事件发生后呼吁在这里,在这里还有这里? 重要的示例: 在我的模型中,我有一个名为3的变量。在我的HTML中,我有。触发按钮单击之类的事件并在控制器中引发一个处理程序,该处理程序内的代码为: 假设UI线程未被阻止,则单击按钮后用户将看到什么?他只