Room and Rxjava2
前言
关于Room的介绍和基本操作,请看我的这篇文章Room of Jetpack's Architecture Components
rxjava特点
先来简单介绍一下这几个属于RxJava的对象的特点。
- Completable:只有onComplete和onError方法,即是只有“完成”和“错误”两种状态,不会返回具体的结果。
- Single:其回调为onSuccess和onError,查询成功会在onSuccess中返回结果,需要注意的是,如果未查询到结果,即查询结果为空,会直接走onError回调,抛出EmptyResultSetException异常。
- Maybe:其回调为onSuccess,onError,onComplete,查询成功,如果有数据,会先回调onSuccess再回调onComplete,如果没有数据,则会直接回调onComplete。
- Flowable/Observable:这俩相信不用多介绍了,这是返回一个可观察的对象,每当查询语句查询的部分有变化时,都会回调它的onNext方法,直到Rx流断开。
使用Room的好处
- 更少的样板代码
- 编译时检查的SQL查询
- 异步和可观察查询的功能
所有这些都可以通过Room(来自架构组件的持久性库)来实现。异步查询返回LiveData或RxJava的Maybe,Single或Flowable。LiveData和Flowable的查询是可观察,它们可以在数据更改时自动进行更新,以确保UI响应数据库中的最新值。如果您已经在你的应用程序中使用RxJava 2,然后使用Room的Maybe
,Single
和Flowable
将变得轻而易举。
考虑以下UI:用户能够查看和编辑其用户名。这和有关用户的其他信息一起保存在数据库中。这是插入,更新,删除和查询用户的方法。
Insert
Room集成RxJava允许以下相应的插入返回类型:
Completable
— 插入完成后onComplete
立即被调用Single<Long>
或Maybe<Long>
-onSuccess
发送的值是插入的项目的行idSingle<List<Long>>
或Maybe<List<Long>>
-onSuccess
发送的值是插入的项目的行id的列表
如果在插入数据时出错,Completable
,Single
和Maybe
将在onError
中发送异常。
@Insert
fun insert(user: User): Completable@Insert
fun insert(user: User): Single<Long>@Insert
fun insert(user: User): Maybe<Long>@Insert
fun insert(vararg users: User): Single<List<Long>>@Insert
fun insert(vararg users: User): Maybe<List<Long>>@Query("INSERT INTO user VALUES(:firstName, :lastName, :age)")
fun insert(firstName: String, lastName: String, age: Int): Single<Long>@Query("INSERT INTO user VALUES(:firstName, :lastName, :age)")
fun insert(firstName: String, lastName: String, age: Int): Maybe<Long>
- 返回的类型是
Long
也只能是Long
,否则无法通过编译。 - 返回的
Long
值,是指的插入的行id。 - 使用
observeOn
操作符指定Observer
在哪个Scheduler
上观察Observable
,subscribeOn
操作符指定Observable
会运行在哪个Scheduler
上。
Update/Delete
Room集成RxJava允许以下相应的插入返回类型:
Completable
— 更新/删除完成后onComplete
立即被调用Single<Integer>
或Maybe<Integer>
-其中onSuccess上发送的值是受更新/删除影响的行数
@Update/Delete
fun insert(user: User): Completable@Update/Delete
fun insert(user: User): Single<Int>@Update/Delete
fun insert(user: User): Maybe<Int>@Update/Delete
fun insert(vararg users: User): Single<List<Int>>@Update/Delete
fun insert(vararg users: User): Maybe<List<Int>>@Query("UPDATE user SET firstname = :firstName WHERE age = :age")
fun updateFirstName(age: Int, firstName: String): Single<List<Int>>@Query("UPDATE user SET firstname = :firstName WHERE age = :age")
fun updateFirstName(age: Int, firstName: String): Maybe<List<Int>>
注意:
- 返回的类型为
Integer
也只能是Integer
,否则无法通过编译。 - 返回的
Integer
值,指的是该次操作影响到的总行数,比如该次操作更新了5条,就返回5
Query
为了从数据库中获取用户,我们可以在数据访问对象类(UserDao
)中编写以下查询:
@Query(“SELECT * FROM Users WHERE id = :userId”)
User getUserById(String userId);
这种方法有两个缺点:
- 这是一个阻塞的同步调用
- 每次修改用户数据时,我们都需要手动调用此方法
Room提供了观察数据库数据和通过Rxjava的Maybe、Single、Flowable的帮助下执行异步查询的选项,如果您担心线程,Room可让您放心,并确保在主线程之外进行可观察的查询。您可以通过在observeOn
方法中设置Scheduler
来决定事件在哪个线程上向下游发出
Maybe
@Query(“SELECT * FROM Users WHERE id = :userId”)
Maybe<User> getUserById(String userId);
- 当数据库中没有用户并且查询不返回任何行时,
Maybe
将onComplete
。 - 当数据库中有一个用户时,
Maybe
将触发**onSuccess**
并onComplete
。 - 如果
Maybe
在**onComplete
后更新用户**,则不会发生任何事情。
Single
@Query(“SELECT * FROM Users WHERE id = :userId”)
Single<User> getUserById(String userId);
- 当数据库中没有用户并且查询不返回任何行时,
Single
将触发**onError(EmptyResultSetException.class)**
- 当数据库中有一个用户时,
Single
将触发**onSuccess**
。 - 如果
Single
在onComplete
后更新用户,则不会发生任何事情。
Flowable/Observable
@Query(“SELECT * FROM Users WHERE id = :userId”)
Flowable<User> getUserById(String userId);
- 当数据库中没有用户并且查询不返回任何行,则
**Flowable**
*不会发送,既没有onNext
,也不是onError
。 - 当数据库中有一个用户时,
Flowable
将触发**onNext**
。 - 每次更新用户数据时,该
Flowable
对象都会自动发出,从而使您可以基于最新数据来更新UI。
参考链接:
Room配合RxJava2,使用方法兼使用心得兼注意事项
Room
Room and Rxjava2相关推荐
- flux java_FluxJava 新增 RxJava2 的支援功能
FluxJava 最初的设计就是以 Add-on 的方式来提供对于 RxJava 的支持,所以这次增加 RxJava2 的部份也依照相同的模式,在 Project 中加上了 fluxjava-rx2 ...
- RxJava2 / RxAndroid2的merge操作合并多个Observable
RxJava2/RxAndroid2的merge操作合并多个Observable RxAndroid2/RxJava2的merge操作合并若干个Observable为单个可观测的Observable, ...
- Android每周一个学习计划——RxJava2 0的学习使用
序言:蜗壳已经退役一年多了,但是还是抵不住蜗壳在NBA界的影响力,最近NBA流行向"蜗壳挑战",事情起源于蜗壳给IT和北境之王设定了新赛季的挑战,然后众多球星也纷纷向蜗壳讨要挑战. ...
- java二次封装_基于OKhttp+Rxjava2+Retrofit进行二次封装
概述 基于Retrofit进行二次封装,优雅的初始化设置.基于Okhttp拦截器和基础缓存,封装了无网络和其他所有场景的缓存策略支持,以及频繁调用请求的丢弃策略. 特性 1.基于Retrofit的二次 ...
- 如何从RxJava升级到RxJava2
如何从RxJava升级到RxJava2. RxJava2已经推出有一年半的时间,由于之前RxJava已经在现有项目中广泛使用,而RxJava2在除了很多命名外并没有太多革新,所以相信有很多人跟我一样都 ...
- java concat和 的区别,RxJava2 merge和concat 区别
merge merge 将全部订阅 Observable,但是谁先完成谁先通知,如果大家完成时间一样,按顺序调用 public static void rxJava2() { Observable.m ...
- Android rxjava2的disposable
rxjava+retrofit处理网络请求 在使用rxjava+retrofit处理网络请求的时候,一般会采用对观察者进行封装,实现代码复用和拓展.可以参考我的这篇文章:rxjava2+retrofi ...
- 图解RxJava2(一)
前言 从这篇文章开始,系统地学习RxJava2设计思想和源码实现.说起大热门RxJava,网上有很多例如响应式编程.观察者模式等介绍,也有一些优秀的文章以上.下游等概念引初学者入门,在初步学习之后,可 ...
- RxAndroid2 / RxJava2简单的CompletableObserver
RxAndroid2 / RxJava2简单的CompletableObserver CompletableObserver简单的用法跟踪一个任务的结束,不处理复杂的数据传导,例如: package ...
- android上传头像 sockettimeoutexception,Kotlin - Retrofit2和Rxjava2封装的网络请求类(含图片上传)...
阅读建议:本文适合熟悉Retrofit与Rxjava2的同学阅读,其中也包含一丢丢的RxLifecycle,文中不包含这两个库的使用说明.不熟悉RxJava的同学,建议去这里了解,里面包含3篇文章,均 ...
最新文章
- 虚拟化厂商VMware、微软和思杰的vGPU支持概述
- 2.7 HBase架构深入剖析
- 大型Java项目架构演进
- Loj2687,jzoj3320-文本编辑器【线头dp】
- 计算线段长度(信息学奥赛一本通-T1033)
- 谢宝友:会说话的Linux内核
- 计算机应用技术老师全国计算机应用技术考试,全国计算机应用证书 全国计算机应用技术证书考试作业.doc...
- OpenCV能调用的摄像头类型
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_2_一切皆为字节...
- 怎么判断前轮左右的位置_老司机教你如何用方向盘,判断左右车轮位置,新手司机一看就会!...
- 使用Pycharm安装numpy库
- vscode设置中文流程
- cass道路设计教程_(完整版)南方CASS7.1绘制道路断面图教程
- 各层电子数排布规则_电子数的排布规律是什么?
- 计算机服务无法启动,Win7系统下windows firewall服务无法启动怎么解决【图文】
- 点击电脑桌面图标就点计算机图标老是出现是否删除快捷方式,电脑桌面上的快捷方式图标总是有小箭头怎么删掉...
- english need study and insist 1
- java实验作业:银行账户
- 图片按指定比例缩放并压缩至指定大小,解决保存图片文件体积过大bug。
- 直播预告 | 端云协同的淘宝机器学习系统