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()方法来终止整个任务,但是之后的发送操作会继续执行。
此方法的意义在之后涉及的多线程操作中更加明显。