第二次检索 Activity 的 ViewModel 的最佳方法

问题描述 投票:0回答:1

这是指南建议首次检索 Activity 的 ViewModel 的方式,这通常发生在

onCreate
内:

public class FooActivity extends AppCompatActivity {

    @Inject
    ViewModelProvider.Factory viewModelFactory;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //...
        
        FooViewModel viewModel = new ViewModelProvider(this, viewModelFactory)
            .get(FooViewModel.class);
    }

}

现在这肯定是一个成本高昂的操作,因为我们正在创建 ViewModelProvider 的新实例。它也有点冗长。如果我在

onCreate
之外再次需要 ViewModel 怎么办?

我最初想将其缓存在活动内的私有变量中,但这不会泄漏 ViewModel 吗?例如:

public class FooActivity extends AppCompatActivity {
    FooViewModel viewModel;

    @Inject
    ViewModelProvider.Factory viewModelFactory;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //...
        
        viewModel = new ViewModelProvider(this, viewModelFactory)
            .get(FooViewModel.class);
    }

    @Override
    protected void onStop() {
        //...
        
        viewModel.someMethod();
    }

}

如果我在

viewModel
中手动将
onDestroy
变量设置为 null,这种方法会更安全吗?

另一种替代方法是以某种方式从活动中检索关联的 ViewModel。 AppCompatActivity 有一个 ViewModelStore,但调用

getViewModelStore()
返回一个对象,其中只有
clear
方法可用。

那么在fragmentless Activity中第二次获取关联的ViewModel的推荐方法是什么?

java android viewmodel android-viewmodel
1个回答
0
投票

我最初想将其缓存在活动内的私有变量中,但这不会泄漏 ViewModel 吗?

仅当活动本身被泄露时。活动视图模型的生命周期比活动本身的生命周期长,因为视图模型的存在部分是为了在配置更改后继续存在,这涉及共享视图模型实例的活动的多个实例。

如果我在

viewModel
中手动将
onDestroy
变量设置为 null,这种方法会更安全吗?

只有当你泄露你的活动时,这是一个更大的问题。

那么在fragmentless Activity中第二次获取关联的ViewModel的推荐方法是什么?

在 Java 中,将其保留在活动的字段中,就像在第二个代码片段中一样。

© www.soinside.com 2019 - 2024. All rights reserved.