Android ViewModel使用

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、数据永久存储

参照SharedPreferences

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实例引用了它们,则由于引用周期问题而成为问题。

参考链接

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注