要想获得食物,就必须一直寻找,只有这样,才有机会。不要气馁,就算找不到肥羊,至少能找到一只兔子——《狼道》
前言
——这篇主要是梳理一下Jetpack架构组件之一的ViewModel,并结合楼主所学做个总结。面向那些还不认识ViewModel的同学们。看完这篇可以快速了解它,并轻松使用。也想请教前辈们指点文章中的错误或不足的地方。本篇只针对ViewModel,不会拓展额外的知识如MVVM,若想了解更多关于Jetpack组件知识可以看楼主写的Jetpack专栏。
一、简介
(1)ViewModel是什么
——ViewModel 是google推出的Jetpack架构组件之一,设计成以生命周期的方式存储和管理UI相关的数据。
举个列子来消化一下:
——当发生横竖屏切换或其他意外导致Activity重启时,里面的临时数据将会丢失。以前可以利用onSaveInstanceState()保存简单的数据并在onCreate()中恢复,但只适用于少量可以序列化反序列化的数据,并不能适用于任何情况。这时就可以使用ViewModel来管理这些数据。当然ViewModel并不只 只有这个作用。
那ViewModel为什么可以管理这些数据呢?
主要还是因为ViewModel的生命周期比Activtiy生命周期来的更长。如:
这就要求我们在onCreate()方法时就启动ViewModel。
从图中可以看出当Activity意外重启时,ViewModel也一直存活,所以把数据存交给ViewModel管理后就不会意外丢失数据。
(2)ViewModel有什么用
- 可以存储和管理因Activity意外重启(如:屏幕切换)丢失的数据。
- 可以管理Acitvity中使用的异步调用,或监听事件因Activity销毁而没有及时清理造成的内存泄漏。
- 可以将Activity中有关数据获取的操作移到ViewModel里面,实现视图与数据相互分离,更容易维护。
- 可以在Fragment之间共享数据。
(3)有什么优点
针对用法,可以得出以下优点:
- 存储和管理数据
- 避免内存泄漏
- 解耦
- 共享数据
二、基本使用
(1)添加依赖
可以使用androidx的appcompat,里面包含许多的依赖,包括viewodel。
implementation 'androidx.appcompat:appcompat:1.0.0'
当然也可以添加自己熟悉的版本,每个版本使用方式都有稍微差别:
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.1.0'
楼主这边要分析的是官网上的例子,所以添加的依赖是:
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
这个依赖主要作用是在使用ViewModel的基础上多封装了一个ViewModelProviders类。
(2)继承ViewModel
因为ViewModel是个抽象类,所以需要声明一个类来继承它。
public class MyViewModel extends ViewModel {
private String name ="张三";
private String data ="网络数据";
//获取用户名字
public String getUserName(){
return name;
}
//获取数据
public String loadData(){
//加载网络数据的逻辑
return data;
}
}
其实这边获取网络数据的时候可以配合LiveData一起使用,因为加载网络数据都会有一点的延迟。并能立即就得到数据,所以使用liveData的话,当有数据回调的时候,可以通知UI更新。但这边只单纯介绍ViewModel,就不详细说明了。想要了解LiveData 请看