线程的调度又叫线程的切换,在Rxjava是默认规则中,事件的发出(由被观察者完成)和消费(由观察者完成)是在同一个线程中,但是在实际开发中,我们经常会遇到类似的情景:在子线程中进行耗时的操作,然后回到主线程进行UI操作,在这种情况下显然需要进行线程的切换,这时我们如何来完成呢?本节将进行讲解。
文章线索:
- Observable(被观察者)和Observer()默认的工作线程
- 观察者和被观察者如何进行不同线程切换
- 关于ObserverOn()与SubscribeOn(),我们了解多少?
- Rxjava中内置了哪些线程?有什么区别?
- 通过实战了解和学习Rxjava2中线程的调度
线程如何切换
Observable和Observer默认在主线程中执行
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
emitter.onNext(4);
Log.d(TAG, "Observable thread is : " + Thread.currentThread().getName());
emitter.onComplete();
}
}).subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "onSubscribe");
}
@Override
public void onNext(Integer integer) {
Log.d(TAG, "Observer thread is :" + Thread.currentThread().getName());
Log.d(TAG, "onNext: " + integer);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
Log.d(TAG, "onComplete");
}
});
运行结果如下:
从代码中可以看出,当不指定Observable和Observer所在线程时,默认他们都工作在主线程,被观察者在主线程分别发射了整型数据的1,2,3,4事件,观察者在主线程依次接收,直到事件完成。
观察者和被观察者如何在不同线程中进行切换
在上面的例子中,默认情况下观察者和被观察者都工作在主线程,即主线程发送数据和主线程接收,假如我们需要实现被观察者在子线程中发送数据,然后观察者在主线程中进行接收,那么通过RxJava 内置的线程调度器就可以很轻松的实现,实现代码如下:
Observable.create(new ObservableOnSubscribe<Integer>() {
@SuppressLint("LongLogTag")
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
for (int i = 0; i < 4; i++) {
Log.e(TAG, "上游被观察者Observable在子线程为" + Thread.currentThread().getName() + "生产一个事件: " + i );
emitter.onNext(i);
SystemClock.sleep(3000);
}
emitter.onComplete();
}
}).subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Integer>() {
@Override