一、架构组件
注:如果您之前未接触过android,对android基本知识不甚了解,建议查阅android官网官方指南
Android官方提供了一个Jetback组件库。可帮助您设计稳健、可测试且易维护的应用。您可以从管理界面组件生命周期和处理数据持久性的类着手。
- 管理应用的生命周期。新的生命周期感知型组件可帮助您管理 Activity 和 Fragment
的生命周期。在配置更改后继续有效、避免内存泄漏,以及将数据轻松加载到界面中。 - 使用 LiveData 构建数据对象,在基础数据库改变时通知视图。
- ViewModel 存储界面相关的数据,这些数据不会在应用旋转时销毁。
- Room 是一个 SQLite 对象映射库。它可用来避免样板代码,还可以轻松地将 SQLite 表数据转换为 Java 对象。Room提供 SQLite 语句的编译时检查,并且可以返回 RxJava、Flowable 和 LiveData 可观察对象。
二、向项目中添加组件
打开项目的 build.gradle 文件(而不是应用或模块的该文件)并添加 google() 代码库,如下所示:
allprojects {
repositories {
google()
jcenter()
}
}
三、ViewModel
为什么使用viewmodel?
ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。
Android 框架可以管理界面控制器(如 Activity 和 Fragment)的生命周期。Android 框架可能会决定销毁或重新创建界面控制器,以响应完全不受您控制的某些用户操作或设备事件。
如果系统销毁或重新创建界面控制器,则存储在其中的任何瞬态界面相关数据都会丢失。例如,应用可能会在它的某个 Activity 中包含用户列表。为配置更改重新创建 Activity 后,新 Activity 必须重新提取用户列表。对于简单的数据,Activity 可以使用 onSaveInstanceState() 方法从 onCreate() 中的捆绑包恢复其数据,但此方法仅适合可以序列化再反序列化的少量数据,而不适合数量可能较大的数据,如用户列表或位图。
另一个问题是,界面控制器经常需要进行可能需要一些时间才能返回的异步调用。界面控制器需要管理这些调用,并确保系统在其销毁后清理这些调用以避免潜在的内存泄漏。此项管理需要大量的维护工作,并且在为配置更改重新创建对象的情况下,会造成资源的浪费,因为对象可能需要重新发出已经发出过的调用。
诸如 Activity 和 Fragment 之类的界面控制器主要用于显示界面数据、对用户操作做出响应或处理操作系统通信(如权限请求)。如果要求界面控制器也负责从数据库或网络加载数据,那么会使类越发膨胀。为界面控制器分配过多的责任可能会导致单个类尝试自己处理应用的所有工作,而不是将工作委托给其他类。以这种方式为界面控制器分配过多的责任也会大大增加测试的难度。
从界面控制器逻辑中分离出视图数据所有权的操作更容易且更高效。
ViewModel的创建与实现
架构组件为界面控制器提供了 ViewModel 辅助程序类,该类负责为界面准备数据。在配置更改期间会自动保留 ViewModel 对象,以便它们存储的数据立即可供下一个 Activity 或 Fragment 实例使用。例如,如果您需要在应用中显示用户列表,请确保将获取和保留该用户列表的责任分配给 ViewModel,而不是 Activity 或 Fragment,如以下示例代码所示:
public class MainViewModel extends ViewModel {
private MutableLiveData<Calculator> calculatorMutableLiveData;
private MutableLiveData<String> topContent;
private MutableLiveData<String> bottomContent;
public MutableLiveData<Calculator> getCalculatorMutableLiveData() {
if(calculatorMutableLiveData==null){
calculatorMutableLiveData=new MutableLiveData<>();
Calculator calculator=new Calculator();
calculatorMutableLiveData.setValue(calculator);
}
return calculatorMutableLiveData;
}
//....其他待实现代码
ViewModel常与LiveData、MutableLiveData搭配使用。
为了对数据观测,使得数据发生改变时,我们需要以下代码
MainViewModel model=new ViewModelProvider(this,new ViewModelProvider.NewInstanceFactory()).get(MainViewModel.class);
model.getBottomContent().observe(this, bottomContent -> {
//你项实现的动作,更新UI
});
ViewModel生命周期
您通常在系统首次调用 Activity 对象的 onCreate() 方法时请求 ViewModel。系统可能会在 Activity 的整个生命周期内多次调用 onCreate(),如在旋转设备屏幕时。ViewModel 存在的时间范围是从您首次请求 ViewModel 直到 Activity 完成并销毁。