RxJava1升级到RxJava2的注意事项
1、package更改
rx1包名由原来的rx.xxx更改为io.reactivex.xxx,并且在同一个module之下,rx1和rx2是不兼容的。
2、背压支持
RxJava在1.0只有一个个观察者模式,只能部分支持背压:
- Observable(被观察者)/Observer(观察者)
- Observable(被观察者)/Subscriber(观察者)
RxJava在2.0出现了两个观察者模式,新增Flowable支持背压,而Observable不支持背压:
- Observable(被观察者)/Observer(观察者)
- Flowable(被观察者)/Subscriber(观察者)
注:背压是指在异步场景中,被观察者发送事件速度远快于观察者的处理速度的情况下,一种告诉上游的被观察者降低发送速度的策略,简而言之,背压是流速控制的一种策略。
3、NULL值支持
rx1.x是可以支持NULL值的
Observable.just(null);
Single.from(null);
rx2.x是不支持NULL值的
Observable.just(null)
.subscribe(System.out::println, Throwable::printStackTrace);
Single.just(null)
.subscribe(System.out::println, Throwable::printStackTrace);
4、ActionN 和 FuncN 改名
ActionN 和 FuncN 遵循Java 8的命名规则。
其中,Action0 改名成Action,Action1改名成Consumer,而Action2改成BiConsumer,而Action3 - Action9都不再使了,ActionN改成Consumer<Object[]>,新的Action都增加抛出异常处理
同样,Func改名成Function,取消了Func0的方法,Func2改名成BiFunction,Func3 - Func9 改成 Function3 - Function9,FuncN 改为 Function<Object[], R>,新的Function都增加抛出异常处理
5、Subscription改为Disposable
rx1.x的Subscription
public final Subscription subscribe(final Action1<? super T> onNext)
rx2.x返回值的是Disposable,由于已经存在了 org.reactivestreams.subscription 这个类,为了避免名字冲突将原先的 rx.Subscription 改名为 io.reactivex.disposables.Disposable
public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError)
注意:Subscription 不再有订阅subcribe和unSubcribe的概念。
6、Observer和Subscriber更改
rx2.x中Observable不在支持Subscriber方法,改由Flowable支持Subscriber,而Observable只支持Observer方法。
新增onSubscribe方法,Observer提供了Disposable参数,而Subscriber提供了Subscription参数,向观察者提供以同步和异步方式取消与Observable的连接的方法。
rx1.x的Observer
public interface Observer<T> {
void onCompleted();
void onError(Throwable e);
void onNext(T t);
}
rx2.x的Observer
public interface Observer<T> {
void onSubscribe(Disposable d);//
void onNext(T value);
void onError(Throwable e);
void onComplete();
}
public interface Subscriber<T> {
void onSubscribe(Subscription s);//相当于onStart方法
void onNext(T value);
void onError(Throwable e);
void onComplete();
}
7、Observable.OnSubscribe改为ObservableOnSubscribe
rx1.x写法
Observable.create(new Observable.OnSubscribe<Object>() {
@Override
public void call(Subscriber<? super Object> subscriber) {
}
});
rx2.x写法
Observable.create(new ObservableOnSubscribe<Object>() {
@Override
public void subscribe(ObservableEmitter<Object> e) throws Exception {
}
});
8、ObservableOnSubscribe 中使用 ObservableEmitter 发送数据给 Observer
ObservableEmitter可以理解为发射器,这个就是用来发出事件的,它可以发出三种类型的事件,通过调用emitter的onNext(T value)、onComplete()和onError(Throwable error)就可以分别发出next事件、complete事件和error事件。emitter的onComplete()调用后,Consumer不再接收任何next事件。
9、Observable.Transformer 变成 ObservableTransformer
rx1.x的写法
public synchronized <T> Observable.Transformer<T, T> bindToLifeCycle() {
return new Observable.Transformer<T, T>() {
@Override
public Observable<T> call(Observable<T> tObservable) {
if (lifecycleSubject == null) return upstream;
return upstream.takeUntil(lifecycleSubject);
}
};
}
rx2.x的写法
public synchronized <T> ObservableTransformer<T, T> bindToLifeCycle() {
return new ObservableTransformer<T, T>() {
@Override
public ObservableSource<T> apply(Observable<T> upstream) {
if (lifecycleSubject == null) return upstream;
return upstream.takeUntil(lifecycleSubject);
}
};
}
同时新增Flowable的写法
public synchronized <T> FlowableTransformer<T, T> bindToLifeCycle() {
return new FlowableTransformer<T, T>() {
@Override
public Publisher<T> apply(Flowable<T> upstream) {
if (lifecycleSubject == null) return upstream;
return upstream.takeUntil(lifecycleSubject);
}
};
}
10、from变更
rx1.x中统一使用from方法名,但rx2.x不在使用from,而是已from+参数类型名命名
rx2.x新增了Publisher参数的from方法。
rx1.0
public static <T> Observable<T> from(T[] array)
public static <T> Observable<T> fromCallable(Callable<? extends T> func)
public static <T> Observable<T> from(Iterable<? extends T> iterable)
public static <T> Observable<T> from(Future<? extends T> future)
rx2.0
public static <T> Observable<T> fromArray(T... items)
public static <T> Observable<T> fromCallable(Callable<? extends T> supplier)
public static <T> Observable<T> fromFuture(Future<? extends T> future)
public static <T> Observable<T> fromIterable(Iterable<? extends T> source)
public static <T> Observable<T> fromPublisher(Publisher<? extends T> publisher)
11、blocking变更
rx1.x
.toBlocking().firstOrDefault(defaultValue)
rx2.x
.blockingFirst(defaultValue);
在项目升级RxJava中暂时遇到这些变更,具体RxJava2.x的使用请去github查看https://github.com/ReactiveX/RxJava
RxJava1升级到RxJava2的注意事项的更多相关文章
- Rxjava1升级Rxjava2踩坑一记
Rxjava1升级Rxjava2坑 共存问题 通常情况下,如果我们希望在一个模块中既想使用rxjava1又想使用rxjava2,这个时候在运行的时候会出现一下报错: ... APK META/-INF ...
- 如何从RxJava升级到RxJava2
如何从RxJava升级到RxJava2. RxJava2已经推出有一年半的时间,由于之前RxJava已经在现有项目中广泛使用,而RxJava2在除了很多命名外并没有太多革新,所以相信有很多人跟我一样都 ...
- Android Studio从2.3升级到3.1注意事项
原文:https://blog.csdn.net/lithiumyoung/article/details/80111111 Android Studio从2.3升级到3.1注意事项 项目根目录下的b ...
- Android RxJava1.X升级到RxJava2.X笔记
简书地址 http://www.jianshu.com/p/2badfbb3a33b 描述 RxJava 1.X RxJava 2.X package包名 rx.xxx io.reactivex.xx ...
- 如何升级Ceph版本及注意事项
升级软件版本在日常运维中是一个常见操作. 本文分享一下Ceph版本升级的一些经验. 一般升级流程和注意如下: 1. 关注社区Release notes 和 ceph-user邮件订阅列表,获取社区发 ...
- gradle tool升级到3.0注意事项
Gradle版本升级 其实当AS升级到3.0之后,Gradle Plugin和Gradle不升级也是可以继续使用的,但很多新的特性如:Java8支持.新的依赖匹配机制.AAPT2等新功能都无法正常使用 ...
- python2.7升级到python3.6注意事项
python3.6下载地址:https://www.python.org/downloads/source/ 1.安装依赖包:gcc openssl-devel.zlib-devel.readli ...
- 必读的 Android 文章
必读的 Android 文章 掘金官方 关注 2017.06.07 13:58* 字数 25218 阅读 8782评论 2喜欢 218 写给 Android 开发者的混淆使用手册 - Android ...
- Lodop提示安装或升级的注意事项
LODOP的LodopFuncs.js文件里,自动判断浏览器类型提示下载哪个,根据版本号比较判断提示升级.此文章是以前写的,图示可能过旧,新版提示不同,但是LodopFuncs.js里各个方面变动不大 ...
随机推荐
- python中硬要写抽象类和抽象方法
由于python没有抽象类.接口的概念,所以要实现这种功能得abc.py这个类库,具体方式如下: # coding: utf-8import abc #抽象类class StudentBase(obj ...
- Python资源 --Python库
环境管理 管理 Python 版本和环境的工具 pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. virtualenv – 创建独立 Python 环境的工 ...
- 27_网络编程-初识socket
一.C/S B/S 架构 1.定义 (1)C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Cl ...
- SpringCloud之Eureka集群
前面我们介绍了SpringCloud注册中心Eureka,但是存在一个单点故障的问题,一个注册中心远远不能满足实际的生产环境,现在我们介绍一下如何搭建一个Eureka集群. 一:集群环境搭建 我们先建 ...
- ss的使用配置(电脑、手机FQ)
注:FQ仅用于google查阅资料等,禁止违规违法行为 自己搭建ss服务 1.vps购买:https://www.alpharacks.com/holiday 按流程填完相关信息(Operating ...
- iOS开发-从16进制颜色中获取UIColor
目前iOS中设置UIColor只能使用其枚举值.RGB等方法,不能直接将常用的16进制颜色值直接转为UIColor对象,所以写了点代码,将16进制颜色值转为UIColor. 代码如下, //头文件#i ...
- Flask常用的钩子函数
before_first_request:处理第一次请求之前执行.例如以下代码: @app.before_first_request def first_request(): print 'first ...
- 理解WSGI
WSGI是什么? WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义 ...
- Git使用(1)
安装git完成后 1.首先配置你的用户信息,用于体现在你的提交记录中包含your name and your email git config --global user.name "you ...
- Spring Boot 基础概述与相关约定配置
今天打算整理一下 Spring Boot 的基础篇,这系列的文章是我业余时间来写的,起源于之前对微服务比较感兴趣,微服务的范畴比较广包括服务治理.负载均衡.断路器.配置中心.API网关等,还需要结合 ...