知识背景:
扔物线的金典RxJava
RxJava进阶一
RxJava进阶二
RxJava进阶三
RxJava进阶四
RxJava的好处大家都知道,能使代码逻辑结构看起来更清晰,当需要进行前后台处理的时候,一般会进行observeOn和subscribeOn的调用,然而这2个方法的调用没有那么简单:
observeOn:设置Observer观察者在什么线程运行;
subscribeOn:设置Observable被观察者在什么线程运行;
以上是最基本的使用,但是在使用的时候,调用的顺序和次数都会有影响:
subscribeOn: subscribeOn 作用于该操作符之前的 Observable 的创建操符作以及 doOnSubscribe 操作符
observeOn: observeOn除了设置Observer观察者在什么线程运行,还将影响后面的onNext,map….的运行线程.
上实例:
Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
Log.d(TAG, "Observable thread is : " + Thread.currentThread().getName());
Log.d(TAG, "emit 1");
emitter.onNext(1);
}
});
//该类只接收next发出的事件
Consumer<Integer> consumer = new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.d(TAG, "Observer thread is :" + Thread.currentThread().getName());
Log.d(TAG, "onNext: " + integer);
}
};
observable
.doOnNext(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Thread.sleep(10000);
Log.d(TAG, "a thread is: " + Thread.currentThread().getName());
Log.d(TAG, "doOnNext a: " + integer);
}
})
//
.flatMap(new Function<Integer, ObservableSource<Integer>>() {
@Override
public ObservableSource<Integer> apply(@NonNull Integer integer) throws Exception {
Thread.sleep(10000);
Log.d(TAG, "c thread is: " + Thread.currentThread().getName());
Log.d(TAG, "doOnNext c: " + integer);
return Observable.just(integer);
}
})
.subscribeOn(Schedulers.newThread())
.doOnNext(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Thread.sleep(10000);
Log.d(TAG, "b thread is : " + Thread.currentThread().getName());
Log.d(TAG, "doOnNext b: " + integer);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(consumer);
如果把observeOn的方法放到前面,可以看看各个方法所在的线程
Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
Log.d(TAG, "Observable thread is : " + Thread.currentThread().getName());
Log.d(TAG, "emit 1");
emitter.onNext(1);
}
});
//该类只接收next发出的事件
Consumer<Integer> consumer = new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.d(TAG, "Observer thread is :" + Thread.currentThread().getName());
Log.d(TAG, "onNext: " + integer);
}
};
observable
.doOnNext(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Thread.sleep(10000);
Log.d(TAG, "a thread is: " + Thread.currentThread().getName());
Log.d(TAG, "doOnNext a: " + integer);
}
})
//
.flatMap(new Function<Integer, ObservableSource<Integer>>() {
@Override
public ObservableSource<Integer> apply(@NonNull Integer integer) throws Exception {
Thread.sleep(10000);
Log.d(TAG, "c thread is: " + Thread.currentThread().getName());
Log.d(TAG, "doOnNext c: " + integer);
return Observable.just(integer);
}
})
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Thread.sleep(10000);
Log.d(TAG, "b thread is : " + Thread.currentThread().getName());
Log.d(TAG, "doOnNext b: " + integer);
}
})
.subscribe(consumer);
参考官方说明http://reactivex.io/documentation/operators/observeon.html