RxJava 复刻简版之四,线程切换

补充知识点:Rx 即 Reactive Extensions,因此 RxJava 是为 java 扩展的响应式编程库,使数据可以异步地运用

1、线程类型

  1. Schedulers.io:常用,读写文件/数据库/网络请求
  2. Schedulers.newThread:耗时操作
  3. Schedulers.computation:CUP密集计算,图片压缩/数据格式解析
  4. Schedulers.trampoline:当前线程
  5. AndroidSchedulers.mainThread:主线程,更新UI

2、例子

java 复制代码
        Single.just(777)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(getSingleObserver(tag));

3、流程

1、just(777) ,声明数据处理器

java 复制代码
class SingleJust<T>(private val value: T) : Single<T>() {
    override fun subscribeActual(observer: SingleObserver<in T>) {
        observer.onSubscribe(Disposable.disposed())
        observer.onSuccess(value)
    }
}

2、subscribeOn、observeOn,声明处理的观察者

java 复制代码
class SingleSubscribeOn<T>(
    private val source: SingleSource<out T>,
    private val scheduler: Scheduler
) : Single<T>() {
    override fun subscribeActual(observer: SingleObserver<in T>) {
        val parent = SubscribeOnObserver(observer, source)
        observer.onSubscribe(parent)
        val f = scheduler.scheduleDirect(parent)
        parent.task.replace(f)
    }

    internal class SubscribeOnObserver<T>(
        private val downstream: SingleObserver<in T>,
        private val source: SingleSource<out T>
    ) :
        AtomicReference<Disposable>(), SingleObserver<T>, Disposable,
        Runnable {
        val task = SequentialDisposable()

        override fun onSubscribe(d: Disposable) {
            DisposableHelper.setOnce(this, d)
        }

        override fun onSuccess(t: T) {
            downstream.onSuccess(t)
        }

        override fun onError(e: Throwable) {
            downstream.onError(e)
        }

        override fun dispose() {
            DisposableHelper.dispose(this)
            task.dispose()
        }

        override fun isDisposed() = DisposableHelper.isDisposed(get())

        override fun run() {
            source.subscribe(this)
        }
    }
}
java 复制代码
class SingleObserveOn<T>(
    private val source: SingleSource<out T>,
    private val scheduler: Scheduler
) : Single<T>() {
    override fun subscribeActual(observer: SingleObserver<in T>) {
        source.subscribe(ObserveOnSingleObserver(observer, scheduler))
    }

    internal class ObserveOnSingleObserver<T>(
        private val downstream: SingleObserver<in T>,
        private val scheduler: Scheduler
    ) :
        AtomicReference<Disposable>(), SingleObserver<T>, Disposable,
        Runnable {
        var value: T? = null
        var error: Throwable? = null

        override fun onSubscribe(d: Disposable) {
            if (DisposableHelper.setOnce(this, d)) {
                downstream.onSubscribe(this)
            }
        }

        override fun onSuccess(t: T) {
            this.value = t
            val d = scheduler.scheduleDirect(this)
            DisposableHelper.replace(this, d)
        }

        override fun onError(e: Throwable) {
            error = e
            val d = scheduler.scheduleDirect(this)
            DisposableHelper.replace(this, d)
        }

        override fun run() {
            val ex = error
            if (ex != null) {
                downstream.onError(ex)
            } else {
                downstream.onSuccess(value!!)
            }
        }

        override fun dispose() {
            DisposableHelper.dispose(this)
        }

        override fun isDisposed() = DisposableHelper.isDisposed(get())
    }
}

4、分析

1、执行subscribe,老规矩,通通回调到 subscribeActual 的具体实现

未完待续

相关推荐
Kapaseker1 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴1 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭11 小时前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab12 小时前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe18 小时前
Now in Android 架构模式全面分析
android·android jetpack
二流小码农1 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos
鹏程十八少1 天前
4.Android 30分钟手写一个简单版shadow, 从零理解shadow插件化零反射插件化原理
android·前端·面试
Kapaseker1 天前
一杯美式搞定 Kotlin 空安全
android·kotlin
三少爷的鞋1 天前
Android 协程时代,Handler 应该退休了吗?
android
火柴就是我2 天前
让我们实现一个更好看的内部阴影按钮
android·flutter