1、线程切换使用实例
Observable.create(object:ObservableOnSubscribe<String>{
override fun subscribe(e: ObservableEmitter<String>) {
e.onNext("A")
}
}) .subscribeOn(Schedulers.io()) //设置订阅线程
.observeOn(AndroidSchedulers.mainThread()) //设置观察者线程
.subscribe()
- onSubscribe():执行线程就是创建Observable的当前线程,并不订阅线程、观察者线程的影响,因为从源码中无论看出BasicFuseableObserver还是继承类中针对onSubscribe()都没有进行线程操作
public final void onSubscribe(Disposable s) {
if (beforeDownstream()) {
actual.onSubscribe(this);//调用下游的onSubscribe(),层层传递
afterDownstream();
}
}
2、observeOn():设置观察者线程
public final Observable<T> observeOn(Scheduler scheduler) {
return observeOn(scheduler, false, bufferSize());
}
public final Observable<T> observeOn(Scheduler scheduler, boolean delayError, int bufferSize) {
return RxJavaPlugins.onAssembly(new ObservableObserveOn<T>(this, scheduler, delayError, bufferSize));
}
observeOn()操作符最终创建的是ObservableObserveOn对象,在ObservableObserveOn中保存设置的线程,并在执行时切换线程,在ObservableObserveOn的subscribeActual()中创建工作线程保存在Observer中,所以Observe只会作用于下游观察者
public ObservableObserveOn(ObservableSource<T> source, Scheduler scheduler, boolean delayError, int bufferSize) {
super(source); // 保存Observable
this.scheduler = scheduler; //保存Schedule
this.delayError = delayError;
this.bufferSize = bufferSize;
}
//订阅执行的方法
@Override
protected void subscribeActual(Observer<? super T> observer) {
if (scheduler instanceof TrampolineScheduler) {
//设置为TrampolineScheduler直接执行
source.subscribe(observer);
} else {
Scheduler.Worker w = scheduler.createWorker(); //
source.subscribe(new ObserveOnObserver<T>(observer, w, delayError, bufferSize));
}
}
2.1、 Scheduler.Worker
这里设置的是AndroidSchedulers.mainThread(),在AndroidSchedulers中创建HandlerScheduler对象,这里使用的是Looper.getMainLooper()工作队列,所以观察者执行会在主线程中执行
public final class AndroidSchedulers {
priv