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订阅流程:
Rxjava 线程是如何切换?
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
//上层 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() {
}
})
源码分析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;
}