1、ViewModel解决:
-
瞬态数据丢失
-
异步调用的内存泄露(例如发出网络请求后销毁activity,但返回参数的内存仍然被占用;一般结合LiveData使用)
-
类膨胀提高维护难度和测试难度
获取ViewModel的方法:
//activity
mViewModel = new ViewModelProvider(this,new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(XXXViewModel.class);
mViewModel = new ViewModelProvider(this,new SavedStateViewModelFactory(getApplication(),this).get(XXXViewModel.class))
//fragment
mViewModel = new ViewModelProvider(this).get(ThirdViewModel.class);
2、ViewModel SavedState 数据临时存储
应用场景:应用进入后台时间太久或系统资源不足而杀掉应用,导致数据丢失
法一:使用Activity本身自带的saveInstanceState
使用:在Activity中
final static String KEY = "key";
@Override
protected void onCreate(Bundle savedInstanceState){
//...
if(savedInstanceState!=null){
//getInt数据类型对应下面putInt
testViewModel.getXX().setValue(savedInstanceState.getInt(KEY));
}
}
@Override
protected void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
//putInt数据类型可以自选
outState.putInt(KEY,testViewModel.getXX().getValue());
}
法二:使用ViewModel自带的 SavedState
**1.**添加依赖
**2.**在ViewModel中使用
<img src="F:\Notes\Typora\Pictures\image-20211021145354050.png" alt="image-20211021145354050" style="zoom:70%;" align=’left’/>
**3.**wow直接就是liveData格式咩!
注意此时ViewModel的构造方法需要传入SavedStateHandle new SavedStateVMFactory(activity)
3、数据永久存储
5、上下文信息
5.1 注意
不要向ViewModel中传入**<font color=red>context</font>**,会导致内存泄露
如果要使用context,请使用AndroidViewModel中的Application,例如:
public class MyViewmodel extends AndroidViewModel{...}
5.2 AndroidViewModel
AndroidViewModel提供应用程序上下文
如果需要在Viewmodel中使用上下文,则应使用AndroidViewModel(AVM),因为它包含应用程序上下文。要检索上下文调用getApplication()
,否则请使用常规的ViewModel(VM)。
AndroidViewModel具有应用程序上下文。我们都知道*拥有<font color=red>静态上下文实例</font>是有害的,因为它可能导致<font color=red>内存泄漏</font>!*但是,**拥有静态Application实例并没有您想象的那么糟糕,**因为正在运行的应用程序中只有一个Application实例。
因此,在特定类中使用Application实例并使其具有通常不是问题。但是,如果Application实例引用了它们,则由于引用周期问题而成为问题。
参考链接