refer:https://blog.csdn.net/dingshuhong_/article/details/99705348
Single.just("1")
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onSuccess(String integer) {
}
@Override
public void onError(Throwable e) {
}
});
![](https://img.haomeiwen.com/i5334394/9cb61b12b9446731.png)
observable每个操作符都对observable进行一次包装,返回新的observable,在create中会创建emiter发射器。执行订阅(subscirbe)后,开始回调每一层observable的subscirbe方法,最终到数据源,开始执行发射数据,通过subscribeOn指定数据产生的线程,这里会创建一个线程池(是rxjava自己写的一个线程池,没有用java默认的那五种),指定一个线程,执行该线程的run方法,在observeOn指定消费数据的线程,切换线程是通过获取主线程的handler,通过handler切换数据到主线程。
多个多个 subscribeOn()只会有第一个生效,原因是只有第一个决定了数据源的产生在哪个线程,等执行后面的subscribeOn()的时候,数据已经产生了
一句话总结RxJava子线程和主线程的原理
切换到子线程的关键是将Runnable放到线程池去执行,切换到主线程是利用在主线程实例化的Handle发送Message,让runnable回调到主线程去。
refer:https://blog.csdn.net/dawN4get/article/details/80102677
网友评论