一、概念
EventBus有个缺点就是凡是使用了EventBus的类都不能进行混淆了,否则Evnetbus就找不到OnEvent方法了。
RxJava要比EventBus的应用更广泛,EventBus仅仅是作为一种消息的传递工具,但是RxJava里面几乎可以做任何事情。
如果是Android开发的话,可以使用RxAndroid,这是对RxJava的一个扩展,结合sqare公司的retrofit可以很轻松的完成网络的访问。在Android中异步操作一般使用AsycTask来完成,但是AsycTask有很多缺点,如不能方便的终止任务的执行等。
RxAndroid完全可以替代AsycTask来完成各种异步操作,而且还有BindActivity和BindFragment方法,你根本不需要考虑异步操作时的Activity和Fragment的生命周期问题,还有更加强大的的链式调用,可以使程序很简洁。
二、模式
RxJava中有四个基本概念:观察者、被观察者/主题、订阅、事件。
- Observable/Observer(不支持backpress)
- Flowable/FlowableSubscriber(支持backpress)
- Single/SingleObserver(只发送一个onSuccess或者onError的通知)
- Completable/CompletableObserver(只发送一个onComplete或者onError的通知)
- Maybe/MaybeObserver(Single与Completable的结合,只发送一个onSuccess或者onComplete或者onError的通知)
2.1 Observable
Observable
.just(1, 2, 3)
.subscribe(new Observer < Integer > () {
@Override public void onSubscribe(Disposable d) {}
@Override public void onNext(Integer value) {}
@Override public void onError(Throwable e) {}
@Override public void onComplete() {}
});
2.2 Flowable
与上一个的区别在于支持背压,也就是说,下游会知道上游有多少数据,所以他Subscriber会是这样
Flowable
.just(1, 2, 3, 4)
.subscribe(new Subscriber < Integer > () {
@Override public void onSubscribe(Subscription s) {
s.request(Long.MAX_VALUE);
}
@Override public void onNext(Integer integer) {}
@Override public void onError(Throwable t) {}
@Override public void onComplete() {}
});
三、线程切换
//常用的线程策略
Schedulers.immediate()//在当前线程运行,默认为此策略;
Schedulers.newThread()//每次都创建新的线程执行操作;
Schedulers.io()//类似newThread()但是此策略有无限量的线程池,主要用于读写文件、数据库、网络请求等;
Schedulers.computation()//用于需要计算的策略,使用线程池,池大小为CPU核心数;
Schedulers.trampoline()//将任务加入一个队列,等待执行
AndroidSchedulers.mainThread()//在Android主线程中执行,RxAndroid独有
在调用subscribeOn(Schedulers.io())
之后,会创建ObservableSubscribeOn
parent.setDisposable(scheduler.scheduleDirect(new Runnable() {
@Override
public void run() {
source.subscribe(parent);
}
}
));
在这个过程中,会把source也就是ObservableSource在线程中订阅,同时也把把传入的Observer变成SubscribeOnObserver。若指定的是io线程,可以在IoScheduler
中看见对线程的管理。
在调用observeOn(AndroidSchedulers.mainThread())
时,会产生一个ObservableObserveOn,同时还会把Observer变成ObserveOnObserver,可以发现在HandlerScheduler
,在ui线程调用了ObserveOnObserver的run
方法
四、实例
final Observable<String> mObservable = Observable.create(new Observable.OnSubscribe<String>(){
@Override
public void call(Subscriber<? super String> subscriber) {
Log.e(TAG,Thread.currentThread().getName());
try {
sleep(4000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
subscriber.onNext("Hello");
try {
sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
subscriber.onNext("Yes,i\'m fine,thank you!");
subscriber.onCompleted();
}
});
final Observer<String> mTestSubscriber = new Observer<String>() {
@Override
public void onCompleted() {
Log.e(TAG,"onCompleted: "+ Thread.currentThread().getName());
}
@Override
public void onError(Throwable e) {
Log.e(TAG,"onError: "+ Thread.currentThread().getName());
}
@Override
public void onNext(String s) {
Log.e(TAG,Thread.currentThread().getName());
hideWaitingDialog();
Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
}
};
调用
subscribe = mObservable
.subscribeOn(Schedulers.io())
.doOnSubscribe(new Action0() {
@Override
public void call() {
showWaitingDialog(); // 需要在主线程执行
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(mTestSubscriber);
}