RxJava有引以为傲的链式调用、海量的操作符、便捷的线程切换。如果找到一个入口同时了解三者,线程切换再合适不过,它同时利用了三者的特性,又不至于内容过于琐碎繁杂。
RxJava切换线程的操作符总共只有两个:observeOn和subscribeOn:
- observeOn用于切换观察者Observer的onNext执行线程
- subscribeOn用于切换被观察者Observable的subscribe执行线程
如下这段代码就是本篇分析的重点,很好地体现了链式调用的特点:不加分号,一点到底。(为了减小篇幅,中间部分使用了lambda表达式)
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Integer> emitter) throws Throwable {
Log.d("Aoli","subscribe on" + Thread.currentThread());
emitter.onNext(101);
}
})
.subscribeOn(Schedulers.single())
.doOnNext(integer -> Log.d("Aoli", "subscribeOn single" + Thread.currentThread()))
.subscribeOn(Schedulers.computation())
.doOnNext(integer -> Log.d("Aoli", "subscribeOn computation" + Thread.currentThread()))
.subscribeOn(Schedulers.io())
.doOnNext(integer -> Log.d("Aoli", "subscribeOn io" + Thread.currentThread()))
.subscribeOn(Schedulers.trampoline())
.doOnNext(integer -> Log.d("Aoli", "subscribeOn trampoline" + Thread.currentThread()))
.subscribeOn(Schedulers.newThread())
.doOnNext(integer -> Log.d("Aoli", "subscribeOn newThread" + Thread.currentThread()))
.observeOn(Schedulers.single())
.doOnNext(integer -> Log.d("Aoli", "observeOn single" + Thread.currentThread()))
.observeOn(Schedulers.computation())
.doOnNext(integer -> Log.d("Aoli", "observeOn computation" + Thread.currentThread()))
.observeOn(Schedulers.io())
.doOnNext(integer -> Log.d("