思路步骤
- 创建一个全局的ViewModelProvider.Factory对象: 在应用的主Application类中创建一个全局的ViewModelProvider.Factory对象,用于创建和管理ViewModel实例。
- 在需要使用ViewModel的Activity或Fragment中获取ViewModel实例: 通过ViewModelProvider来获取ViewModel实例。可以在Activity或Fragment中创建一个ViewModel的成员变量,并在onCreate方法中初始化。
- 确保获取的ViewModel实例是同一个对象: 通过使用相同的ViewModelProvider和ViewModelProvider.Factory对象,可以确保获取的ViewModel实例是同一个对象,实现全局共享。
- 处理ViewModel的生命周期: ViewModel的生命周期与Activity或Fragment的生命周期相关联。当Activity或Fragment被销毁时,ViewModel的onCleared方法将会被调用,可以在这个方法中释放资源。
案例示例
要设计一个全局可调用的ViewModel对象,可以使用Android Jetpack中的ViewModel和ViewModelProvider来实现。
首先,需要在应用的主Application类中创建一个全局的ViewModelProvider.Factory对象。这个Factory对象将用于创建和管理ViewModel实例。
public class MyApplication extends Application {
private ViewModelProvider.Factory viewModelFactory;
@Override
public void onCreate() {
super.onCreate();
viewModelFactory = new ViewModelProvider.AndroidViewModelFactory(this);
}
public ViewModelProvider.Factory getViewModelFactory() {
return viewModelFactory;
}
}
在需要使用ViewModel的Activity或Fragment中,通过ViewModelProvider来获取ViewModel实例。可以在Activity或Fragment中创建一个ViewModel的成员变量并在onCreate方法中初始化。
private MyViewModel myViewModel;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyApplication myApplication = (MyApplication) getApplication();
ViewModelProvider.Factory factory = myApplication.getViewModelFactory();
ViewModelProvider viewModelProvider = new ViewModelProvider(this, factory);
myViewModel = viewModelProvider.get(MyViewModel.class);
}
}
这样,通过ViewModelProvider获取的ViewModel实例将会是同一个对象,可以在整个应用的生命周期内共享。
需要注意的是,ViewModel的生命周期与Activity或Fragment的生命周期相关联。当Activity或Fragment被销毁时,ViewModel的onCleared方法将会被调用,可以在这个方法中释放资源。
@Override protected void onCleared() {
super.onCleared();
// 释放资源 }
}
应用场景【主页领三十Android进阶模块笔记】
一个常见的应用场景是在多个Activity或Fragment中共享数据。例如,一个购物车的ViewModel对象可以在多个页面中共享,这样可以确保购物车的数据在不同页面中的一致性。另外,全局可调用的ViewModel对象还可以用于存储应用的全局状态,例如用户登录状态等。通过ViewModel的数据持久性,可以在应用的不同组件之间共享和保持数据的一致性。