RxJava2.0(一) Observable Observer

RxJava已经流行了一段时间了,其魅力不多说,简而言之就是逻辑简洁的异步操作处理——骚操作

个人觉得需要理解一些逻辑上面的步骤以及概念,才能很好地使用这个强大的库。

基本概念

Observable 字面意思是被观察者,使用rxjava的时候,先会习惯得先创建一个这样的玩意,类似上游发送出来的命令,可以在这里决定异步操作模块的顺序和异步操作模块的次数

Observer  观察者,听起来感觉是这个主动一点,当初我也是这样被迷惑的,看的角度不同,其实异步操作模块的具体实现是在这里的,可以在不同的线程中执行任务。有些任务可以多线程同时进行的,就像多个小兵一起执行任务,但是必须有个将军来统一率领他们。所以总结一句话就是Observable 就是将军,制定战略计划,(在编写程序的时候就已经决定好),Observer就是小兵,执行具体的任务,执行完单个任务后,必须通知将军,好让将军继续实施他的计划。

subscribe() 发布,开始执行计划。

  //派遣一名将领
        Observable<String> general = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                e.onNext("侦查");//制定任务:侦查
                e.onNext("进攻");//定制任务:进攻
                e.onNext("撤退");//定制任务:撤退
                e.onComplete();//作战结束
            }
        });
        //调遣一批士兵
        Observer<String> soldiers = new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "开始作战");
            }

            @Override
            public void onNext(String value) {
                Log.d(TAG, "" + value);
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "作战失败");
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "作战完成");
            }
        };
        //开始执行任务
        general.subscribe(soldiers);

日志:

D/rxjava: 开始作战
D/rxjava: 侦查
D/rxjava: 进攻
D/rxjava: 撤退
D/rxjava: 作战完成

也可以转化成rxjava自豪的链式操作

 Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                e.onNext("侦查");//制定任务:侦查
                e.onNext("进攻");//定制任务:进攻
                e.onNext("撤退");//定制任务:撤退
                e.onComplete();//作战结束
            }
        }).subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "开始作战");
            }

            @Override
            public void onNext(String value) {
                Log.d(TAG, "" + value);
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "作战失败");
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "作战完成");
            }
        });

值得注意的是,无论是创建Oberver还是Observable,都是采用内部类的方式来创建,直接实现里面的方法

查看源码知道这两个玩意都是接口,Observable在subscribe方法中决定了各个子任务的调用顺序,同时,传递的参数都是同一个类型String,既然要通信,当然是使用同一种语言。

ObservableEmitter: Emitter是发射器的意思,那就很好猜了,这个就是用来发出事件的,它可以发出三种类型的事件,通过调用emitter的onNext(T value)onComplete()onError(Throwable error)就可以分别发出next事件、complete事件和error事件。

next事件可以发送无数次,但是一旦发送了Complete或者error事件,整个作战任务就结束了,后面发送的任何事件都不会执行,这点理解也容易,就是将军一旦宣布作战完成或者作战失败,原定计划上的后续任务就没有执行的意义了,如果硬是执行,会导致非常糟糕的结局。

接下来介绍Disposable, 这个单词的字面意思是一次性用品,用完即可丢弃的。Observer方法的onSubscribe(Disposable d)方法的一个参数,如果在执行作战任务的时候,发现情况突变,不适宜执行当下的作战计划任务的时候,可以调用d.dispose()方法来终止整个任务,但是之后的发送操作会继续执行。

此方法的意义在之后涉及的多线程操作中更加明显。

 

转载于:https://my.oschina.net/carbenson/blog/995387

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值