【问题标题】:ViewModel behind the scene幕后视图模型
【发布时间】:2018-10-15 09:16:19
【问题描述】:

我不明白 UI 控制器重新创建时创建的 ViewModel 实例是如何存活的?

换句话说... 乳清这种方法

ViewModelProviders.of(this).get(MyViewModel.class);

重新调用时返回之前退出的 ViewModel 实例?

【问题讨论】:

  • ViewModel 是没有 UI 和 setRetainInstance(true) 的片段,它被附加,作用于传递的片段或 Activity,因此当重新创建 Activity 以进行旋转时,例如它将被保存,并且call 将返回相同的实例,基本规则,如果 ViewModel 存在于相同的范围内,则将返回相同的实例,否则将创建一个新的实例。
  • 谢谢 Anis,但你确定 ViewModel 是一个片段吗? ViewModel 类不扩展片段

标签: android mvvm viewmodel android-jetpack android-architecture-components


【解决方案1】:

get(MyViewModel.class)

返回现有的 ViewModel 或在范围内创建一个新的 ViewModel(通常是片段或活动),与 this 关联。创建的 ViewModel 与给定的范围关联,将被保留 只要范围是活动的(例如,如果它是一个活动,直到它是 完成或进程被杀死)

public <T extends ViewModel> T get(@NonNull Class<T> modelClass) {
    String canonicalName = modelClass.getCanonicalName();
    if (canonicalName == null) {
        throw new IllegalArgumentException("Local and anonymous classes can not be ViewModels");
    }
    return get(DEFAULT_KEY + ":" + canonicalName, modelClass);
}

如果我们进一步探索,带有两个参数的 get(String key, Class modelClass) 方法返回视图模型。您可以在函数中看到视图模型是否存在它将返回,否则它将创建一个新的。

public <T extends ViewModel> T get(@NonNull String key, @NonNull Class<T> modelClass) {
        ViewModel viewModel = mViewModelStore.get(key);

        if (modelClass.isInstance(viewModel)) {
            //noinspection unchecked
            return (T) viewModel;
        } else {
            //noinspection StatementWithEmptyBody
            if (viewModel != null) {
                // TODO: log a warning.
            }
        }

        viewModel = mFactory.create(modelClass);
        mViewModelStore.put(key, viewModel);
        //noinspection unchecked
        return (T) viewModel;
    }

Here is the reference

【讨论】:

  • 感谢穆沙希德,它帮助了我很多
【解决方案2】:

经过很好的搜索,我找到了这个post,它解释了我到底需要什么..

【讨论】:

  • 我认为它不再有效。我可以在代码中看到ViewModelStoregetLastNonConfigurationInstance 恢复,而不是用Fragment 中的setRetainInstance 恢复
猜你喜欢
  • 1970-01-01
  • 2022-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
相关资源
最近更新 更多