在RxJava的使用过程中,通常会用subscribeOn来指定可观察者Observable的线程,用observerOn来指定观察者Observer的线程。本文将分析RxJava2.x的线程切换原理
先来看一个例子
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
mRxOperatorsText.append("Observable emit 1" + "\n");
Log.d(TAG, "Observable emit 1" + "\n");
e.onNext(1);
mRxOperatorsText.append("Observable emit 2" + "\n");
Log.d(TAG, "Observable emit 2" + "\n");
e.onNext(2);
mRxOperatorsText.append("Observable emit 3" + "\n");
Log.d(TAG, "Observable emit 3" + "\n");
e.onNext(3);
//e.onComplete();
mRxOperatorsText.append("Observable emit 4" + "\n");
Log.d(TAG, "Observable emit 4" + "\n" );
e.onNext(4);
Log.d(TAG, "subscribe: ThreadName="+Thread.currentThread().getName());
}
}).subscribeOn(Schedulers.io()) //将发射者切换到io线程
.observeOn(AndroidSchedulers.mainThread()) //将接收者切换到主线程
.subscribe(new Observer<Integer>() {
private int i;
private Disposable mDisposable;
@Override
public void onSubscribe(@NonNull Disposable d) {
mRxOperatorsText.append("onSubscribe : " + d.isDisposed() + "\n");
Log.d(TAG, "onSubscribe : " + d.isDisposed() + "\n" );
mDisposable = d;
Log.d(TAG, "onSubscribe: ThreadName="+Thread.currentThread().getName());
}
@Override
public void onNext(@NonNull Integer integer) {
mRxOperatorsText.append("onNext : value : " + integer + "\n");
Log.d(TAG, "onNext : value : " + integer + "\n" );
Log.d(TAG, "onNext: ThreadName="+Thread.currentThread().getName());
i++;
if (i == 2) {
// 在RxJava 2.x 中,新增的Disposable可以做到切断的操作,让Observer观察者不再接收上游事件
mDisposable.dispose();
mRxOperatorsText.append("onNext : isDisposable : " + mDisposable.isDisposed() + "\n");
Log.d(TAG, "onNext : isDisposable : " + mDisposable.isDisposed() + "\n");
}
}
@Override
public void onError(@NonNull Throwable e) {
mRxOperatorsText.append("onError : value : " + e.getMessage() + "\n");
Log.d(TAG, "on