Android 架构组件以及 mvvm 框架使用总结

前言:

文章只是我自己在学习相关知识的过程中的简单自我总结,想学习具体知识可以参考我列出的参考文章链接,不过,文章底部给出的 demo 综合了这些知识的用法,还是比较有参考意义的,可以参考。

参考文章:

1、Android 架构组件(3篇)
https://blog.csdn.net/zhuzp_blog/article/details/78871374
2、Android架构组件简介:
http://www.imooc.com/article/282284
3、Android Room 官方指南:
https://blog.csdn.net/u011897062/article/details/82107709
4、深入理解Android为什么不允许Room数据库对象间(外键)引用:
https://blog.csdn.net/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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值