Rxjava 源码学习记

57 阅读1分钟

Rxjava 了解一下create函数:

//Observable 的create函数
Observable.create<Boolean> {
    //emitter 自定义source
        emitter->
}
        // 订阅 subscribe
    .subscribe(object : Observer<Boolean> {
    override fun onSubscribe(d: Disposable) {
    }
    override fun onNext(t: Boolean) {
    }

    override fun onError(e: Throwable) {
    }
    override fun onComplete() {
    }
})

那么创建 这方法创建的具体流程是什么样的呢?

首先:调用 create 函数,源码:1
//1 第一部份
RxJavaPlugins.onAssembly(
    //第二部分 new ObservableCreate,创建
    new ObservableCreate<>(source)
)
1: 第一部份

其中的 onAssembly 这个方法,几乎所有的 Observable的函数都有(.create, .just等),相当于一个 Hook,在初始化Observable 之前运行, 运用方法如下,onAssembly 是static,直接调用

RxJavaPlugins.setOnObservableAssembly { observable ->
    // 一定需要返回一个数据, 也可以返回 null, 不过返回 null时,运行的会报错 
    observable
}

RxJAVA订阅流程:

QQ截图20221214175406.png

Rxjava 线程是如何切换?
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())

QQ截图20221223192201.png

//上层 IOSchedule 的 Worker
threadWorker.scheduleActual(action, delayTime, unit, tasks);
-》 只有会调用 NewThreadWorker 的 scheduleActual 方法
-》 f = executor.submit((Callable<Object>)sr);

下层回调 (切换主线程)
AndroidSchedulers.mainThread() 
-》Scheduler MAIN_THREAD =
    RxAndroidPlugins.initMainThreadScheduler(() -> MainHolder.DEFAULT)
-》MainHolder 的 Scheduler DEFAULT = internalFrom(Looper.getMainLooper(), true);(Looper.getMainLooper() 表示一定切换主线程的Looper)
---》 然后调用  internalFrom(Looper looper, boolean async) 方法,并且返回 new HandlerScheduler(new Handler(looper), async) 
-》 再调用 HandlerScheduler 类里面的 schedule (xx, xx) 方法
-》 schedule()方法通过 Handler 切换到主线程
//Observable 的create函数
Observable.create<Boolean> {
    //emitter 自定义source
        emitter->
    emitter.onNext(false)
}
        //Observable 的所运行的线程 
    .subscribeOn(Schedulers.io())
        // subscribe 回调运行所在的线程(也是线程切换的)
    .observeOn(
           //TODO 获取主线程 Handler
           AndroidSchedulers.mainThread()
    )
        // 订阅 subscribe
    .subscribe(object : Observer<Boolean> {
    override fun onSubscribe(d: Disposable) {
    // 这个函数 回调不参与  subscribeOn 的线程切换(是根据谁调用 Rxjava 就是在那个线程
    }
    override fun onNext(t: Boolean) {
    }

    override fun onError(e: Throwable) {
    }
    override fun onComplete() {
    }
})

QQ截图20221223192450.png

源码分析1

@NonNull
public Disposable scheduleDirect(@NonNull Runnable run, long delay, @NonNull TimeUnit unit) {
    // 每个不同的Worker 分别创建不同的 , 比如 IOTask(),(如果时 IOSchedule new EventLoopWorker(pool.get())
    final Worker w = createWorker();
    //自己又包装 Runnable
    final Runnable decoratedRun = RxJavaPlugins.onSchedule(run);

    DisposeTask task = new DisposeTask(decoratedRun, w);
    
    w.schedule(task, delay, unit);

    return task;
}