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
6条答案
按热度按时间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停止,则ViewModel也将被清除。
55ooxyrt2#
检查
Fragment.java
中的方法onDestroy()
变量 isChangingConfigurations 在“活动”循环时为true,不调用viewModelStore方法clear().
当活动被销毁时,isChangingConfigurations 为false,viewModelStore将被清除。
z0qdvdin3#
通过源代码,我们知道ViewModel与HolderFragment绑定。你可以从ViewModelProviders类中的代码中找到它。
接下来,您可以找到
onDestroy()
上类内HolderFragment最后,打开它,
现在,也许你已经知道了。2就像上面的图片。3当碎片完成时,它就清除了;当活动重新创建时,将不会调用片段的onDestroy(),因为
希望能对你有所帮助。
svgewumm4#
如果您遵循追踪(检查超类别)AppCompatActivity --〉FragmentActivity --〉ComponentActivity
ComponentActivity观察生命周期状态。
onDestory()在配置更改(例如屏幕旋转)时调用,但由于以下条件,viewModel未被销毁。
cgfeq70w5#
我希望在
Activity
结束时调用我的VM的onClear。我使用onPause
,因为对onDestroy
的调用并不总是立即执行...它可能在onPause
之后几秒钟执行:mepcadol6#
执行顺序如下
1.状态已更改()
这意味着观察器在完成之前收到了有关挂起状态更改的信息,因此例如onDestroy()方法已完成。