RxJava从源码到应用——简单介绍及回顾RxJava(3-1)

一、RxJava简介

这句话是官网上的

百度翻译asynchronous——http://fanyi.baidu.com/translate#en/zh/asynchronous

百度翻译event-based——http://fanyi.baidu.com/translate#en/zh/event-based

1、A library for composing asynchronous and event-based programs by using observable sequences

Asychronous

1、异步的,RxJava是一个异步的库

2、基于回调的

Event-based

1、基于事件的

2、事件分发的库,消息传递的库

二-1、RxJava1代码实例

我们先看一下RxJava1的例子,再看一下RxJava2的。

首先我们用Observable的create()方法去创建一个Observable对象

这个create方法里边存放的参数是一个OnSubscribe

最后通过创建出来的Observable对象去subscribe()一个Observer

Observer里边有三个方法,分别是OnComplete(),onError(),onNext()

这个OnSubscribe里边有一个Call()方法,里边的参数是一个subscribe

之后调用Observable的subscribe方法反回了一个Subscription。

这个呢就是一个最简单的RxJava1的一个例子。

 
 
findViewById(R.id.btnRxJava1).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        Subscription tSubscription = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                if (!subscriber.isUnsubscribed()) {
                    subscriber.onNext("test");
                    subscriber.onCompleted();
                }
            }
        }).subscribe(new Observer<String>() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted");
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {
                System.out.println("onNext:" + s);
            }
        });
    }
});

运行过程,首先通过subscribe调用onNext()方法传递一个字符串,然后再调到OnComplete()的时候,打印一下OnCompleted这个字符串,再调到OnNext()的时候,除了打印onNext这个方法名,还回把上边传下来的test打印出来。

它会先去打印这个onNext这个方法名,之后打印传下来的字符串之后onCompleted(),这就是RxJava1的一个比较简单的例子。

二-2、RxJava1的基本元素

1、Observable

2、Observer

3、Subscription

4、OnSubscribe

5、Subscriber

三-1、RxJava2代码实例

先将RxJava1代码注释起来,之后切换一下库

    //    compile 'io.reactivex:rxjava:1.3.0'
//    compile 'io.reactivex:rxandroid:1.2.1'
    compile 'io.reactivex.rxjava2:rxjava:2.0.0'
    compile 'io.reactivex.rxjava2:rxandroid:2.0.0'

之后我们看一下RxJava2的代码

 findViewById(R.id.btnRxJava2).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Observable.create(new ObservableOnSubscribe<String>() {
                @Override
                public void subscribe(ObservableEmitter<String> e) throws Exception {
                    if (!e.isDisposed()) {
                        e.onNext("1");
                        e.onNext("2");
                        e.onNext("3");
                        e.onNext("4");
                        e.onNext("5");
                        e.onNext("6");
                        e.onNext("7");
                        e.onNext("8");
                        e.onNext("9");
                        e.onNext("10");
                        e.onComplete();
                    }
                }
            }).subscribe(new Observer<String>() {
                @Override
                public void onSubscribe(Disposable d) {
                    System.out.println("onSubscribe");
                }

                @Override
                public void onNext(String value) {
                    System.out.println("onNext:" + value);
                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onComplete() {
                    System.out.println("onCompleted");
                }
            });

            Flowable.create(new FlowableOnSubscribe<String>() {
                @Override
                public void subscribe(FlowableEmitter<String> e) throws Exception {
                    if (!e.isCancelled()) {
                        e.onNext("test");
                        e.onComplete();
                    }
                }
            }, BackpressureStrategy.DROP).subscribe(new Subscriber<String>() {
                @Override
                public void onSubscribe(Subscription s) {
//                        s.request(Long.MAX_VALUE);
                    System.out.println("onSubscribe");
} @Override public void onNext(String s) { System. out.println( "onNext:" + s); } @Override public void onError(Throwable t) { } @Override public void onComplete() { System. out.println( "onCompleted"); } }); } });}

可以看到还是相应的一个Observable创建,这是我们比较熟悉的刚才看过的一个东西,

下面呢还有一个Flowable,这两个有什么不一样呢,先来简单去解释一下,因为用RxJava的时候会有一个背压问题,那么在RxJava里边的时候,Observable有一些可以处理背压问题的,有一些是处理不了背压问题的,那么现在呢,在RxJava2里边,他们就把这两个做了一个拆分,那么现在Observable完全不去处理背压问题,新拆出来一个Flowable是会有一个背压策略的,这一点是这两个的区别,我们先看一下这个完全不去处理的Observable是怎么用的:

首先还是create()的方法,传进去一个ObservableOnSubscribe,然后这里边有一个subscribe()方法,这里有一个新面孔Emitter,之后就是熟悉的调用subscribe()方法,里边传进去一个Observer,可以看到里边多了一个方法OnSubscribe(),里边有一个比较陌生的参数Disponsable,之后又是三个熟悉的方法onNext(),onError(),onCompleted()。

接下来我们看一下新拆出来这个解决背压问题的Flowable是怎么写的:

其实还是同一个模式的有一个create()方法,里边传进去一个FlowableOnSubscribe,之后里边是一个subscribe()方法,参数是一个Emitter,这里有一个第二个参数就是背压策略,这里我们先传入一个Drop丢弃,之后还是熟悉的Subscribe(),参数是Subscriber,这里也是多了一个方法,onSubscribe()的时候,里边会有一个Subscription,之后又是三个熟悉的onNext(),onError(),onComplete(),运行一下。

首先先说上边的Observable,首先是onSubscribe,之后是发送数据test,第三个是onCompleted,上边这个没有问题跟我们之前看得没有什么太大区别,我们接下来看下边这个,首先OnSubscribe是没有问题的,但是接下来的按照前边说的它应该打印onNext,但是它并没有打,而是直接打了OnCompleted,那么这是为什么呢,因为解决背压问题要这样写,要有一个响应式拉取的一个策略,

@Override
public void onSubscribe(Subscription s) {
    s.request(Long.MAX_VALUE);
    System.out.println("onSubscribe");
}

我们再跑一下

现在可以看到这个onNext打印出来了,因为这个Flowable是专门为处理背压来做的,所以在OnSubscribe()的时候需要手动的request一下数据做一个响应式的拉取。

三-2、RxJava2基本元素

1、Observable和Flowable

2、Observer和Subscriber

3、Disponsable和Subscription

4、相应的OnSubscribe

5、Emitter

下章分析

1、RxJava1的基本元素

猜你喜欢

转载自blog.csdn.net/bhhgg8552/article/details/80104971