如何从RxJava升级到RxJava2.

RxJava2已经推出有一年半的时间,由于之前RxJava已经在现有项目中广泛使用,而RxJava2在除了很多命名外并没有太多革新,所以相信有很多人跟我一样都还没有升级.

随着老版本渐渐的失去维护,更重要的是有一定时间允许我来做这个迁移,其实弃老从新一直都是程序员的喜好.

虽然官方提供了文档详尽的介绍了区别,但是文章之长,可能很多人读不下去,却有想快速的迁移过来,我将除了命名改变之外有用的地方总结成了几点,供大家参考.

不能再发射Null了

RxJava2的最大改变就是不能再流里发射Null了,有人会问发射了就怎么了,答案是你的流会因为NPE断开.

比如以前我们会写出这样的代码(详见RxPermission):

Observable.just(null).compose....

在RxJava二中我们需要将它改为(详见RxPermission2):

TRIGGER = new Object()
Observer.just(TRIGGER).compose(xxx)

还有我们常常完成某个工作而不需要返回值,或者根本不关心返回值,将返回的Observable定义为Observable, 如:

xxx.flatMap {
....
return null;
};

现在不能这么写了,对于不需要返回值的,我们应该使用Completable,当然这个在RxJava的时候也已经存在了.

xxx.flatMapCompletable { Completable.fromAction{ } }

还有我们在实现Local Cache与Remote Cache的时候常用的办法:

localObservable = just(localReference);

concat(localObservable, remoteObservable).filter{ i != null }.first()...

会因为在没有Local Cache的时候出错,所以应该改成:

localObservable = just(Optional.fromNullable(localReference));

concat(localObservable, remoteObservable).filter{ i.isPresent() }.firstElement()/.first(defaultValue)...

flatMap方法多了

在上面的介绍中可能已经发现了,老版本只有同类型的flatMap,即Observable <-> Observable, Single <-> Single, 而RxJava2除了同类型的flatMap,还增添了flatMapCompletable,flatMapSingle,flatMapObservable帮助你任意切换.

订阅与反订阅

我们有时候需要在必要的时刻手动的将订阅取消,而防止产生我们不想要的问题,如在跳出定位页面时取消订阅,防止位置信息后面回来造成程序崩溃.

而在RxJava中,我们一般是这么做的:

Subscription subscription = xxxx.subscribe(xxxSubscriber);

subscription.unsubscribe();

在RxJava2中,这个发生了变化,因为你会发现subscribe方法基本上都返回void的,如果你需要手动取消的话,需要使用T subscribeWith(T extends Disposal)方法.

其实我们可以看到,新版的Subscriber或者Observer都多了一个方法void onSubscribe(Subscription s)或者void onSubscribe(Disposable d), 也就是说以前的Subscription是通过订阅后通过回调返回了.

这里RxJava2统一接口到Disposable,提供dispose方法进行反订阅,并且还提供了DisposableObservable,DisposableSingle,DisposableCompletable已经帮我们处理了回调返回的Disposable对象.

所以需要做的改动不大:

Disposable disposable = xxx.subscribeWith(xxxDisposableObserver);

disposable.dispose();

错误处理

错误处理最棒的一点是之前必须实现onError来handle错误,如果不实现,就会抛出OnErrorNotImplement,导致程序崩溃,根据最新的Doc,在RxJava2中,可以轻松Handle未处理的错误.

RxJavaPlugins.setErrorHandler(xxx);

还有一点变化需要注意是的是,当你有并行任务的时候,如果一个线程出错,将会导致整个流中断,其他线程可能会抛出IOInterupedException并且onError无法Handle,这时候必须有上面讲到的ErrorHandler来处理这一类UnDeliveriedException,否则程序会Crash.

Flowable

RxJava2将处理背压(BackPressure)的部分抽出来弄了一个新的对象,叫做Flowable.

以前我们处理背压可能直接通过

xxx.onBackpressureXXXStrategy()...

就可以了.

现在我们得通过Flowable来处理.

xxx.toFlowable(XXXStrategy)...

当然Flowable还提供比较强大的新方法,来处理并发.

比如之前我们需要实现并发,得通过flatMap来实现.

Observable.from(urls).flatMap {
v -> Observable.just(v).subscribeOn(io()).....
}.subscribe(...)

使用Flowable,可以简化为:

Flowable.fromIterable(listingIds)
.parallel().runOn(io())
.map { v -> xxx }
.sequential()

看起来是不是有点炫酷...

测试

对于RxJava2,任何一个Observable都可以转化为一个TestObservable, 通过...test()来进行转换.

而TestObservable提供很多与测试相关的方法,就不用我们亲自去判断.

assertResult,assertError,assertSubscribed.

其他改动

关于名字的变化,这里都不一一论述,包含Func1 -> Function, Action -> Consumer, Observable.Transformer -> ObservableTransformer等等.

如何从RxJava升级到RxJava2的更多相关文章

  1. RxJava1升级到RxJava2的注意事项

    1.package更改 rx1包名由原来的rx.xxx更改为io.reactivex.xxx,并且在同一个module之下,rx1和rx2是不兼容的. 2.背压支持 RxJava在1.0只有一个个观察 ...

  2. Android RxJava1.X升级到RxJava2.X笔记

    简书地址 http://www.jianshu.com/p/2badfbb3a33b 描述 RxJava 1.X RxJava 2.X package包名 rx.xxx io.reactivex.xx ...

  3. RxJava 1升级到RxJava 2过程中踩过的一些“坑”

    RxJava2介绍 RxJava2 发布已经有一段时间了,是对 RxJava 的一次重大的升级,由于我的一个库cv4j使用了 RxJava2 来尝鲜,但是 RxJava2 跟 RxJava1 是不能同 ...

  4. Android RxJava2 浅析

    原文地址:http://blog.csdn.net/maplejaw_/article/details/52442065 Observable 在RxJava1.x中,最熟悉的莫过于Observabl ...

  5. RxJava + Retrofit源码解析

    RxJava + Retrofit怎么请求网络,具体的用法这里就不讲了,本文只讲一些重点源码. 版本如下: okhttp : "com.squareup.okhttp3:okhttp:3.1 ...

  6. Gradle依赖的统一管理,解决依赖冲突

    看见别人在用implementation rootProject.ext.dependencies["xxxx"]不知道是什么意思,上网查了一下,原来是为了解决或者说预防gradl ...

  7. Android 开发技术选型(博客,新闻,阅读类)

    前言 最开始学习写应用的时候,发现类聚合数据这个平台可以提供一些免费数据接口,于是写了个人的第一个应用-– JuheNews,当时的知识储备稍显粗糙,虽然现在的知识也不咋滴,但是相对之前而言还是有些进 ...

  8. 必读的 Android 文章

    必读的 Android 文章 掘金官方 关注 2017.06.07 13:58* 字数 25218 阅读 8782评论 2喜欢 218 写给 Android 开发者的混淆使用手册 - Android ...

  9. Android 在fragment中实现返回键单击提醒 双击退出

    尝试用mvp架构加dagger2来重写了一下,大致功能都实现了,还没有全部完成. 项目地址 接近完成的时候,想在天气信息页面实现一个很常见的功能,也就是点击屏幕下方的返回键的时候不是返回到上一个act ...

随机推荐

  1. ASP.NET 使用Session,避免用户F5刷新时重复提交(转)

    1.使用Session,避免用户重复提交(F5刷新时) 0.起因         当用户上传文件后F5刷新浏览器会导致文件的重复提交和相关程序的重复执行.   1.实现原理         由于刷新提 ...

  2. 用css以写代码形式画一个皮卡丘

    我的个人网站是通过写代码的形式来形成一个网站的,前一阵子在某个大神的github上看到他用写代码的形式来完成一个皮卡丘,于是心血来潮花了半个小时,也完成了一个作品. 这其中涉及到的知识点也不是很复杂, ...

  3. 【视频编解码·学习笔记】11. 提取SPS信息程序

    一.准备工作: 回到之前SimpleH264Analyzer程序,找到SPS信息,并对其做解析 调整项目目录结构: 修改Global.h文件中代码,添加新数据类型UINT16,之前编写的工程中,UIN ...

  4. 关于js的语句类型运算符等

    JavaScript的基本语句有以下几种: 1.for(判断条件){执行内容}: 2.if(条件){...}else{ ....}: 3.while(条件){....}:先判断条件再执行: do{.. ...

  5. 【learning】[待完善]关于辛普森公式的一点想法

    [吐槽] 嗯一开始接触到这个东西其实是因为某道凸包的题目好像可以用这个奇妙的方法来算 但其实了解也不是很深,只是觉得这个东西十分有意思, 所以先稍微写一下自己的想法,了解更多之后慢慢完善 [正题] 首 ...

  6. linux 添加ftp用户与登录配置详解

    不同类Unix有一定区别 版本不同也有些区别 在linux主机上如何添加ftp用户 (一)修改配置文件 vi /etc/vsftpd/vsftpd.conf 在96行,97,98行 96 chroot ...

  7. javascript ES5、ES6的一些知识

    ES6 标签(空格分隔): ES6 严格模式 "use strict" 注意:严格模式也有作用域,如果在某个函数内部声明的话,只在该函数内部有作用 1) 严格模式下全局变量声明必须 ...

  8. Handsontable 筛选事件

    有时候我们需要知道在使用Handsontable时筛选掉了哪些数据,并对这些数据进行处理,可以使用afterFilter事件来进行相关操作. Handsontable筛选掉的数据没有真的被删除,而是被 ...

  9. 华为/华三交换机snmp配置

    snmp-agent                       /使能snmp服务/snmp-agent local-engineid 000007DB7F000001000049DD   /系统自 ...

  10. 用Canvas生成随机验证码(后端前端都可以)

    一 .使用前端生成验证码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...