这篇文章旨在用最简单的方式教会你 ViewModel 如何使用,及它的工作原理。
ViewModel介绍
ViewModel是Google推出的JetPack框架组件的一个,它的主要功能是包装数据,包装后的数据在其宿主(Activity)重建时,数据不会被被重建。
通俗的讲,就是:
在Android系统中,Activity在配置更改后,Activity可能会重启(最常见如屏幕旋转),此时我们 修改 过的Activity的数据(包括在此Activity中网络请求的数据) 就会被销毁然后重新初始化,这些 修改 就会丢失。
例如:如果我们不作处理,在EditText中输入内容,旋转屏幕后,Activity会被销毁重启,我们之前输入的内容也会丢失。这当然不是我们希望看到的。
- 传统方法中,我们可以在Activity销毁前使用 onSaveInstanceState() 的Bundle中存储数据,Activity重启时从 onCreate() 的Bundle中还原其数据,但此方法仅适用于可以序列化然后反序列化的少量数据,而不适用于潜在的大量数据,如列表数据或位图。
- 现在Jetpack组件中的ViewModel能帮助我们在Activity重建时,保护数据不被销毁。 它也可以用于同一个Activity下的所有Fragment之间的数据共享。 真正实现将数据和UI分离。
官方推荐ViewModel和LiveData联合使用,但是为了大家更清楚的理解ViewModel的职责和使用,本篇文章将ViewModel单独拿出来使用,关于LiveData的使用,将在下篇文章细说。
介绍的最后,大家看下这张 Activity 和 ViewModel 生命周期对比(图片摘自Android开发者官网):
从图中我们可以看出,因为 ViewModel封装了数据,所以数据的生命周期比Activity还长,意味着数据不会再随Activity的生命周期而变化,某种程度上实现了UI(Activity )和数据(ViewModel)的分离。
说的有点多了,我们进入正题:
ViewModel使用
1. 基础使用
- 创建新项目,在 MainActivity 的布局文件中给 TextView 添加 Id:data_tv。
- 创建 ModelView 封装的数据类:
public class MyBean extends ViewModel {
private String dataBean;
String getDataBean() {
if (dataBean == null) {
dataBean = “数据”; // 初始化数据
}
return dataBean;
}
void changeValue() {
dataBean = dataBean + " +1 " ;
}
}
- 在 MainActivity 中:
public class MainActivity extends AppCompatActivity {
private static final String TAG = “MainActivity”;
private MyBean mBean;
@Override
protected void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView valueTv = findViewById(R.id.data_tv);
// ViewModel的应用:通过 ViewModelProviders 获取我们自己的 ViewModel(myBean)
mBean = ViewModelProviders.of(this).get(MyBea