代码之家  ›  专栏  ›  技术社区  ›  ir2pid

视图模型何时被清除调用

  •  19
  • ir2pid  · 技术社区  · 6 年前

    视图模型是否独立于活动/片段生命周期或只是其配置更改。何时它们将不再存在,并调用后续的OnCurrRead()方法。 ViewModel是否可以与其他活动共享?

    情况:

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

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

    此外,由于应用程序生命周期回调,OnPosith-Gt;OnStand & Gt;OnDead对于两者都是相同的。

    1.活动旋转

    2.当一项活动结束时,


    调查结果 :

    viewmodel在内部使用holderfragment来保存活动的实例,并使用setRetainInstance方法(如fragments)来解释配置更改。

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

    enter image description here

    4 回复  |  直到 6 年前
        1
  •  11
  •   Sagar    6 年前

    视图模型是独立于活动/片段生命周期还是仅仅 他们的配置改变了。

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

    以下是 lifecycle of ViewModel 从官方网站:

    ViewModel

    ViewModel是否可以与其他活动共享?

    你不应该在活动中那样做。但是片段可以共享 ViewModel 使用他们的活动范围处理他们之间的通信

        2
  •  4
  •   IgorGanapolsky    5 年前

    Fragment.java中的Debug()检查方法

    public void onDestroy() {
            this.mCalled = true;
            FragmentActivity activity = this.getActivity();
            boolean isChangingConfigurations = activity != null && activity.isChangingConfigurations();
            if (this.mViewModelStore != null && !isChangingConfigurations) {
                this.mViewModelStore.clear();
            }
    
        }
    

    变异体 正在更改配置 当活动旋转时, 视图模型存储 方法 清除() 不被调用。

    当活动被破坏时, 正在更改配置 为false,将清除VIEW模型存储区。

        3
  •  2
  •   Longalei    5 年前

    好的,通过源代码,我们知道VIEW模型与HolderFragment.you可以从类VIEW模型提供者中的代码绑定来找到它。

    @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);
    }
    

    希望它能帮助你。

        4
  •  0
  •   sajal    5 年前

    如果你沿着这条路走(查超级班) AppCompatActivity-->碎片活动-->组件活动

    组件活动观察生命周期状态。

    OnDeStury()调用配置更改(例如屏幕旋转),但VIEW模型不会因为以下条件而被破坏。

    getLifecycle().addObserver(new GenericLifecycleObserver() {
                @Override
                public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
                    if (event == Lifecycle.Event.ON_DESTROY) {
                        if (!isChangingConfigurations()) {
                            getViewModelStore().clear();
                        }
                    }
                }
            });