Jetpack系列 - ViewModel从入门到源码

这篇文章旨在用最简单的方式教会你 ViewModel 如何使用,及它的工作原理。

ViewModel介绍

ViewModel是Google推出的JetPack框架组件的一个,它的主要功能是包装数据,包装后的数据在其宿主(Activity)重建时,数据不会被被重建。

通俗的讲,就是:

在Android系统中,Activity在配置更改后,Activity可能会重启(最常见如屏幕旋转),此时我们 修改 过的Activity的数据(包括在此Activity中网络请求的数据) 就会被销毁然后重新初始化,这些 修改 就会丢失。

例如:如果我们不作处理,在EditText中输入内容,旋转屏幕后,Activity会被销毁重启,我们之前输入的内容也会丢失。这当然不是我们希望看到的。


  1. 传统方法中,我们可以在Activity销毁前使用 onSaveInstanceState() 的Bundle中存储数据,Activity重启时从 onCreate() 的Bundle中还原其数据,但此方法仅适用于可以序列化然后反序列化的少量数据,而不适用于潜在的大量数据,如列表数据或位图。
  2. 现在Jetpack组件中的ViewModel能帮助我们在Activity重建时,保护数据不被销毁。 它也可以用于同一个Activity下的所有Fragment之间的数据共享。 真正实现将数据和UI分离。

    官方推荐ViewModel和LiveData联合使用,但是为了大家更清楚的理解ViewModel的职责和使用,本篇文章将ViewModel单独拿出来使用,关于LiveData的使用,将在下篇文章细说。

介绍的最后,大家看下这张 Activity 和 ViewModel 生命周期对比(图片摘自Android开发者官网):

ViewModel和Activity生命周期范围

从图中我们可以看出,因为 ViewModel封装了数据,所以数据的生命周期比Activity还长,意味着数据不会再随Activity的生命周期而变化,某种程度上实现了UI(Activity )和数据(ViewModel)的分离

说的有点多了,我们进入正题:

ViewModel使用

1. 基础使用
  1. 创建新项目,在 MainActivity 的布局文件中给 TextView 添加 Id:data_tv。
  2. 创建 ModelView 封装的数据类:
public class MyBean extends ViewModel {
  private  String dataBean;

  String getDataBean() {
    if (dataBean == null) {
      dataBean = “数据”;  // 初始化数据
    }
    return dataBean;
  }

  void changeValue() {
    dataBean = dataBean + " +1 " ;
  }
}
  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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值