RxJava2.0与1.0的区别

RxJava2.0与1.0的区别

说明:主要借鉴了大神的观点。
知识来源1
知识来源2

1、背压处理

在Rxjava1.0中,背压处理由于并未独立出来。因此有的支持有的不支持。但在Rxjava2.0,出现了两种观察者模式:
Observable(被观察者)/Observer(观察者)
Flowable(被观察者)/Subscriber(观察者)
上面的是Rxjava1.0中背压处理的操作入口,下面的则是Rxjava2.0之后背压处理的更进一步优化。它将背压处理单独拿出来进行操作,这样有了更好的分类。即在2.0中出现了两种(非背压和背压)。

Flowable.range(1, 4).subscribe(new Subscriber() {
    Subscription subscription;
    @Override
    public void onSubscribe(Subscription s) {
        Log.e("rx2_test", "onSubscribe");
        subscription = s;
        //这里可进行一些初始化操作
        subscription.request(1);
    }

    @Override
    public void onNext(Integer integer) {
        Log.e("rx2_test", "onNext:" + integer);
        subscription.request(1);
    }

    @Override
    public void onError(Throwable t) {
        Log.e("rx2_test", "onError:" + t.getMessage());
    }

    @Override
    public void onComplete() {
        Log.e("rx2_test", "onComplete");
    }
});

2、操作符名称变动

a.Action更新:

RxJava2.0与1.0的区别_第1张图片

用法如下:

Flowable.just(1, 2, 3, 4, 5)
        .subscribe(new Consumer() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.e("rx2_test", "actionChange:" + integer);
            }
        });

什么是Action?

Action是RxJava 的一个接口,常用的有Action0和Action1。

Action0: 它只有一个方法 call(),这个方法是无参无返回值的;由于 onCompleted() 方法也是无参无返回值的,因此 Action0 可以被当成一个包装对象,将 onCompleted() 的内容打包起来将自己作为一个参数传入 subscribe() 以实现不完整定义的回调。
Ation1:它同样只有一个方法 call(T param),这个方法也无返回值,但有一个参数;与 Action0 同理,由于 onNext(T obj) 和 onError(Throwable error) 也是单参数无返回值的,因此 Action1 可以将 onNext(obj)和 onError(error) 打包起来传入 subscribe() 以实现不完整定义的回调。

在Rxjava1.0中Action如何使用才能达到与observer同样的效果?

Observable observable = Observable.just("Hello", "World");
        //处理onNext()中的内容
        Action1 onNextAction = new Action1() {
            @Override
            public void call(String s) {
                Log.i(TAG, s);
            }
        };
        //处理onError()中的内容
        Action1 onErrorAction = new Action1() {
            @Override
            public void call(Throwable throwable) {

            }
        };
        //处理onCompleted()中的内容
        Action0 onCompletedAction = new Action0() {
            @Override
            public void call() {
                Log.i(TAG, "Completed");

            }
        };

根据以上Action的参数类型就可以区别出,每个所处理的函数功能:

参数和返回值类型 处理事件类型
有参无返回值 处理onNext事件
-
有参类型为Throwable但无返回值 处理onError事件
-
无参无返回值 处理onCompleted事件

b. Func更新

RxJava2.0与1.0的区别_第2张图片

如何使用?

Flowable.just(1, 2, 3, 4, 5)
        .map(new Function() {
            @Override
            public String apply(@NonNull Integer integer) throws Exception {
                return "xulei" + integer;
            }
        })
        .subscribe(new Consumer() {
            @Override
            public void accept(String s) throws Exception {
                Log.e("rx2_test", "funcChange:" + s);
            }
        });

c.Subscription更新

Subscription改名为Disposable。由于RxJava2中已经存在了org.reactivestreams.subscription这个类,为了避免名字冲突将原先的rx.Subscription改名为io.reactivex.disposables.Disposable。
CompositeSubscription也改名为CompositeDisposable。

d.下游部分onSubscribe函数参数类型有所改变

由之前的Disposable换成了这个Subscription,即:onSubscribe(Subscription s)。

注意:Disposable必须单次使用,用完就要销毁。

d.新增doOnCancel等

RxJava2中除了保留了RxJava1中doOnComplete(),doOnError(),doOnNext()等状态回调之外,还增加了doOnCancel,doOnDispose,unsubscribeOn这几个状态回调,以doOnCancel为例:

Flowable.range(1, 4)
        .doOnCancel(new Action() {
            @Override
            public void run() throws Exception {
                Log.e("rx2_test", "回调doOnCancel");
            }
        })
        .take(2)
        .subscribe(new Consumer() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.e("rx2_test", "doOnCancel:" + integer);
            }
        });

输出结果:

rx2_test: doOnCancel:1
rx2_test: doOnCancel:2
rx2_test: 回调doOnCancel

由于.take(2)操作符只截取了前两个事件,之后的事件未被发送,就会回调doOnCancel中的run()方法。

3、线程调度更新

线程调度这里改动也不大,主要有以下三点:
移除Schedulers.immediate。
移除Schedulers.test。
io.reactivex.Scheduler抽象类支持直接调度自定义线程任务。

主题而言,变化也不大。

你可能感兴趣的:(RxJava1与2的主要区别)