RX.Java入门

作用:

首先说一下RX.JAVA的作用,其实它就是处理异步操作的,类似于 AsyncTask和Handler

原理:

是一种基于扩展的观察者模式:被观察者 (Observable) ——>产生事件           顾客

               观察者(Observe)    ——>接受事件,并给出响应动作    厨房

               订阅(Subscribe)    ——>连接被观察者和观察者     服务员

               事件(Event)      ——>被观察者&观察者沟通的载体    菜式

也就是说,被观察者(Obeservable) 通过 订阅(Subscribe) 按顺序发送事件 给观察者(Observe),观察者(Observe) 按顺序接收事件 & 做出对应的响应动作 


现在正式开始使用:

    步骤1:创建被观察者(Observable) &产生事件

  • 即 顾客进门, 坐椅子上,点菜
  • 具体实现
//1、创建被观察者(Observable)对象
        Observable observable = Observable.create(new ObservableOnSubscribe() {
            /**
             * create() 是RXJava最基本的创造事件序列的方法
             * 此处传入了一个OnSubscribe对象参数
             * 当Observable 被订阅时,OnSubscribe的call方法会自动被调用,即事件序列就会按照设定次序被触发
             * 即观察者Observer会依次调用对应事件的重写方法从而响应事件
             * 这样就实现了被观察者Observable调用观察者的回调方法 & 由被观察者向观察者的事件传递,即观察者模式
             * 2、在复写的subscribe()里定义需要发送的事件
             * */
            @Override
            public void subscribe(ObservableEmitter e) throws Exception {
            /*
            * 通过ObservableEmitter类对象产生事件并通知观察者
            * Observable类介绍
            * a.定义:事件发射器
            * b.作用:定义需要发送的事件 & 向观察者发送事件
            * */
            e.onNext(1);
            e.onNext(2);
            e.onNext(3);
            e.onComplete();
            }
        });
        /*
        * 扩展:RXJava 提供了其他方法用于创建被观察者对象Observable
        * 方法1:just(T..)直接将传入的参数依次发送出来
        * */
        Observable observable1 = Observable.just("A","B","C");
        //将会依次调用:
步骤2:创建观察者(Observer) & 并定义响应事件的行为
  • 即 开厨房, 确定对应菜式
  • 发生的事件类型包括:Next事件、Complete事件&Error事件
  • 具体实现
//1、创建被观察者(Observable)对象
        Observable observable = Observable.create(new ObservableOnSubscribe() {
            /**
             * create() 是RXJava最基本的创造事件序列的方法
             * 此处传入了一个OnSubscribe对象参数
             * 当Observable 被订阅时,OnSubscribe的call方法会自动被调用,即事件序列就会按照设定次序被触发
             * 即观察者Observer会依次调用对应事件的重写方法从而响应事件
             * 这样就实现了被观察者Observable调用观察者的回调方法 & 由被观察者向观察者的事件传递,即观察者模式
             * 2、在复写的subscribe()里定义需要发送的事件
             * */
            @Override
            public void subscribe(ObservableEmitter e) throws Exception {
            /*
            * 通过ObservableEmitter类对象产生事件并通知观察者
            * Observable类介绍
            * a.定义:事件发射器
            * b.作用:定义需要发送的事件 & 向观察者发送事件
            * */
            e.onNext(1);
            e.onNext(2);
            e.onNext(3);
            e.onComplete();
            }
        });
        /*
        * 扩展:RXJava 提供了其他方法用于创建被观察者对象Observable
        * 方法1:just(T..)直接将传入的参数依次发送出来
        * */
        Observable observable1 = Observable.just("A","B","C");
        //将会依次调用:


        //步骤2、创建观察者Observer 并定义响应事件行为 ,相当于开厨房,确定对应菜式
        Observer observer = new Observer() {
            //通过复写对应方法来响应被观察者
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG,"开始采用subscribe链接");
            }

            @Override
            public void onNext(Integer value) {
                Log.d(TAG,"对Next事件"+value+"作出响应");
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG,"对Error事件作出响应");
            }

            @Override
            public void onComplete() {
                Log.d(TAG,"对Complete事件作出响应");
            }
        };
        // 步骤3:通过订阅(Subcribe) 连接观察者和被观察者
        observable.subscribe(observer);

    我们也可以用另一种方式:基于事件流的链式调用方式

 /**
         *使用RXJava事件流链式调用
         **/
        Observable.create(new ObservableOnSubscribe() {
            /**
             * create() 是RXJava最基本的创造事件序列的方法
             * 此处传入了一个OnSubscribe对象参数
             * 当Observable 被订阅时,OnSubscribe的call方法会自动被调用,即事件序列就会按照设定次序被触发
             * 即观察者Observer会依次调用对应事件的重写方法从而响应事件
             * 这样就实现了被观察者Observable调用观察者的回调方法 & 由被观察者向观察者的事件传递,即观察者模式
             * 2、在复写的subscribe()里定义需要发送的事件
             * */
            @Override
            public void subscribe(ObservableEmitter e) throws Exception {
            /*
            * 通过ObservableEmitter类对象产生事件并通知观察者
            * Observable类介绍
            * a.定义:事件发射器
            * b.作用:定义需要发送的事件 & 向观察者发送事件
            * */
                e.onNext(1);
                e.onNext(2);
                e.onNext(3);
                e.onComplete();
            }
        }).subscribe(new Observer() {
            //通过复写对应方法来响应被观察者
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "开始采用subscribe链接");
            }

            @Override
            public void onNext(Integer value) {
                Log.d(TAG, "对Next事件" + value + "作出响应");
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "对Error事件作出响应");
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "对Complete事件作出响应");
            }
        });

可以发现俩中方式的测试效果是相同的:

RX.Java入门_第1张图片


步骤3:当然观察者Observer的订阅方法subscribe还有几个重载方法的,一起来看看

// 表示观察者不对被观察者发送的事件作出任何响应(但被观察者还是可以继续发送事件)
        public final Disposable subscribe() {}
        
        // 表示观察者只对被观察者发送的Next事件作出响应
        public final Disposable subscribe(Consumer onNext) {}
        
        // 表示观察者只对被观察者发送的Next事件 & Error事件作出响应
        public final Disposable subscribe(Consumer onNext, Consumer onError) {}
        
        // 表示观察者只对被观察者发送的Next事件、Error事件 & Complete事件作出响应
        public final Disposable subscribe(Consumer onNext, Consumer onError, Action onComplete) {}
        
        // 表示观察者只对被观察者发送的Next事件、Error事件 、Complete事件 & onSubscribe事件作出响应
        public final Disposable subscribe(Consumer onNext, Consumer onError, Action onComplete, Consumer onSubscribe) {}
        
        // 表示观察者对被观察者发送的任何事件都作出响应
        public final void subscribe(Observer observer) {}

步骤4:我们也可以断开观察者(Observer) 与 被观察者(Observable)的联系,使用Disposable.dispose(),这样的话被观察者(Observable)还是可以继续发送事件的,只是观察者(Observer)接收不到

举个栗子:

RX.Java入门_第2张图片

注意:1、Disposable这个属性是用订阅的方法 OnSubscribe 中赋值过来的

      2、当调用Disposable.dispose断掉被观察者(Observable) 和 观察者(Observer)联系之后,通过logcat可以明显看到观察者Observer收不到事件了。

RX.Java有一些快速创建被观察者(Observable)的方法,也就是说它说一些操作符可以帮助我们快速开发,比如创建被观察者--just的方法,可以看下列代码:

 //1、创建被观察者(Observable)对象
        /**
         *使用RXJava事件流链式调用
         **/
        Observable.just(1,2,3,4).subscribe(new Observer() {
            Disposable mDisposable;

            //通过复写对应方法来响应被观察者
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "开始采用subscribe链接");
                mDisposable = d;
            }

            @Override
            public void onNext(Integer value) {
                if (value == 2) {
                    mDisposable.dispose();
                }
                Log.d(TAG, "对Next事件" + value + "作出响应");
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "对Error事件作出响应");
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "对Complete事件作出响应");
            }
        });

然后传入数组、集合什么的都可以:

RX.Java入门_第3张图片

你可能感兴趣的:(Android,RXJava系列)