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
答案 0 :(得分:5)
ViewModel是否独立于活动/片段生命周期,还是 他们的配置发生了变化。
它们独立于配置更改,并在活动/碎片被破坏时清除。
以下是官方网站上的lifecycle of 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()
}
}
}