Android框架源码分析——RxJava&Schedule源码分析

本文详细分析了RxJava中observeOn和subscribeOn操作符的线程切换机制。observeOn用于设置观察者线程,其在Observer中创建工作线程并在主线程执行。而subscribeOn用于设置订阅线程,它通过ObservableSubscribeOn类创建任务并在指定线程执行事件发送。两者都利用Scheduler来切换工作线程,实现线程调度。总结了线程调度和工作流程,包括IoScheduler的工作原理和线程池的使用。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值