这是指南建议首次检索 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的推荐方法是什么?
我最初想将其缓存在活动内的私有变量中,但这不会泄漏 ViewModel 吗?
仅当活动本身被泄露时。活动视图模型的生命周期比活动本身的生命周期长,因为视图模型的存在部分是为了在配置更改后继续存在,这涉及共享视图模型实例的活动的多个实例。
如果我在
中手动将viewModel
变量设置为 null,这种方法会更安全吗?onDestroy
只有当你泄露你的活动时,这是一个更大的问题。
那么在fragmentless Activity中第二次获取关联的ViewModel的推荐方法是什么?
在 Java 中,将其保留在活动的字段中,就像在第二个代码片段中一样。