前言:
文章只是我自己在学习相关知识的过程中的简单自我总结,想学习具体知识可以参考我列出的参考文章链接,不过,文章底部给出的 demo 综合了这些知识的用法,还是比较有参考意义的,可以参考。
参考文章:
1、Android 架构组件(3篇)
https://blog.youkuaiyun.com/zhuzp_blog/article/details/78871374
2、Android架构组件简介:
http://www.imooc.com/article/282284
3、Android Room 官方指南:
https://blog.youkuaiyun.com/u011897062/article/details/82107709
4、深入理解Android为什么不允许Room数据库对象间(外键)引用:
https://blog.youkuaiyun.com/zhangphil/article/details/78623379
Lifecycle:
Lifecycle 的主要作用是方便其他组件和类来感知 activity 和 fragment 的生命周期。
用法:
首先在 app/build.gradle 中添加依赖.
def lifecycle_version = "1.1.1"
//ViewModel 和 LiveData
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
// 如果用的是java8使用以下的依赖,不然 DefaultLifecycleObserver 引用不到
implementation "android.arch.lifecycle:common-java8:$lifecycle_version"
之后定义一个类或者接口继承自 DefaultLifecycleObserver,覆盖 DefaultLifecycleObserver 中的方法(和 activity fragment 中的生命周期方法相对应),然后在 activity 或者 fragment 中实例化这个类对象并且如下调用:
private IPresenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AppLog.debug(TAG, "onCreate()");
setContentView(R.layout.activity_main);
mPresenter = new MyPresenter();
getLifecycle().addObserver(mPresenter);
}
mPresenter 中就可以感知 activity 或者 fragment 中的生命周期方法了.输出如下:
总结:源码和原理暂时先不深究。
LiveData:
LiveData 是一个数据持有类,它有以下几个特点:
1、数据可以被观察者订阅,当数据有更新时,能够同时通知到观察者(ui)
2、能够感知组件(Fragment、Activity、Service)的生命周期
3、只有在组件出于激活状态(STARTED、RESUMED)才会通知观察者有数据更新
用法:
有两种用法,直接使用 LiveData 对象,常用的 MutableLiveData(LiveData 的子类);继承 LiveData 类,实现特定需求的 LiveData, 这样可以供多个观察者观察,实现数据共享的操作。
LiveData提供了两种改变数据的方法:setValue()和postValue()。区别是setValue()要在主线程中调用,而postValue()既可在主线程也可在子线程中调用。
总结:
LiveData 能够感知组件的生命周期变化其实也是有一个内部类:LifecycleBoundObserver implements GenericLifecycleObserver。源码和原理暂时先不深究。
ViewModel:
ViewModel 主要用于管理和 UI 有关的业务逻辑以及作为 UI 和 Repository 中转的作用,同时它也可以用于 UI 组件间的通信,比如 fragment 之间的通信等。
在 mvvm 架构中, activity 和 fragment 只负责视图显示以及处理用户交互和显示更新数据,具体的与 ui 相关的业务逻辑可以放到 viewmodel 这一层,而 Repository 则负责调用 android 原生接口以及和数据源交互,处理数据的组装以及与数据有关的逻辑。
总结:应用比较简单,但源码和原理暂时先不深究。
Room:
简介:Room 是 google 提供的一个数据库对象关系映射(ORM)框架,方便我们操作 sqlite,并且它能够返回 livedata 数据,也就是说数据库数据更新能同步更新 ui 的显示。
用法:
首先在 app/build.gradle 中添加依赖.
// Room components
implementation "android.arch.persistence.room:runtime:1.1.1"
annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'
androidTestImplementation "android.arch.persistence.room:testing:1.1.1"
具体的用法参考 demo 就好了。
注意,Room 不支持主线程上的数据库访问。
并且 Room 不允许对象间(外键)引用,因为对象间引用会导致查询发生在主线程,而我们知道 Room 不允许在主线程上执行查询,因为主线程直接操作数据库有可能会导致 ui 线程卡死导致app卡顿甚至crash掉。
解决方法是自定义一个包含需要查询的每个实体的 pojo,然后编写一个连接相应表的查询(多表查询必须需要的数据)。
示例:
下面是我使用 mvvm 架构并且结合 livedata, viewmodel, room 写的一个demo, 包含插入,修改,查找,删除的用法示例。
地址:https://github.com/AlongLing/MvvmTest