rxjava2源码分析

目录

一,Observable调用流程

[1.1 简单Observable.create()创建调用流程](#1.1 简单Observable.create()创建调用流程)

[1.2 map操作符](#1.2 map操作符)

[1.3 flatmap操作符](#1.3 flatmap操作符)

[1.4 subscribeOn操作符](#1.4 subscribeOn操作符)

[1.5 observeOn操作符](#1.5 observeOn操作符)



一,Observable调用流程

1.1 简单Observable.create()创建调用流程

上面的这个流程图是下面这段代码调用流程图

复制代码
Observable.create(object :ObservableOnSubscribe<String>{
            override fun subscribe(emitter: ObservableEmitter<String>) {
                emitter.onNext("a")
            }

        }).subscribe({
            Log.d(TAG,"======== onNext value = $it")
        },{
            Log.d(TAG,"======== onError ")
        },{
            Log.d(TAG,"======== onComplete")
        },{
            Log.d(TAG,"======== onSubscribe")
        })
1.2 map操作符
复制代码
Observable.create(object :ObservableOnSubscribe<Int>{
            override fun subscribe(emitter: ObservableEmitter<Int>) {
                emitter.onNext(1)
            }

        }).map { result->
                result.toString()+"map转换"

             }.subscribe({
            Log.d(TAG,"======== onNext value = ${it.toString()}")
        },{
            Log.d(TAG,"======== onError ")
        },{
            Log.d(TAG,"======== onComplete")
        },{
            Log.d(TAG,"======== onSubscribe")
        })
1.3 flatmap操作符
复制代码
Observable.create(object : ObservableOnSubscribe<Int> {
            override fun subscribe(emitter: ObservableEmitter<Int>) {
                emitter.onNext(1)
            }

        }).flatMap(object : Function<Int, ObservableSource<out String>> {
            override fun apply(t: Int): ObservableSource<out String> {
                return Observable.just("${t.toString()}flatmap")
            }

        }).subscribe({
            Log.d(TAG, "======== onNext value = ${it.toString()}")
        }, {
            Log.d(TAG, "======== onError ")
        }, {
            Log.d(TAG, "======== onComplete")
        }, {
            Log.d(TAG, "======== onSubscribe")
        })
1.4 subscribeOn操作符
复制代码
 Observable.create(object : ObservableOnSubscribe<Int> {
            override fun subscribe(emitter: ObservableEmitter<Int>) {
                Log.d(TAG, "======== subscribe 当前线程是${Thread.currentThread().name} ")

                emitter.onNext(1)
            }

        }).subscribeOn(Schedulers.io())/*  .observeOn(AndroidSchedulers.mainThread())*/
            .subscribeOn(Schedulers.newThread())
            .subscribe(MyObserver())

通过多次切换订阅线程,发现只有第一次生效,

看下日志:

D ======== setOnObservableAssembly apply

2023-10-09 20:30:20.440 28448-28448 com.exampl...deActivity com.example.myapplication D ======== setOnObservableAssembly apply

2023-10-09 20:31:53.456 28448-28448 com.exampl...deActivity com.example.myapplication D ======== setOnObservableAssembly apply

2023-10-09 20:32:41.050 28448-28448 com.exampl...deActivity com.example.myapplication D ======== onSubscribe 当前线程是main

根本原因是在订阅的时候

会根据这个订阅源不断的去找上个源,那么到这里就明白了,当前切换线上的会被新的订阅源替代,所以就是为什么多次切换线程只有第一次生效原因

1.5 observeOn操作符

对于observeOn多次切换只有最后一次生效,根本原因是

在ObservableObserveOn对下里面,每次调用onNext的时候都会进行一次线程切换,如果还有后续的Observe,那么就会继续调用这个对应的Observe的onNext方法,虽然每调用一次当前的线程会切换一次,但是最终的消费地方是在业务定义的那个Observe,这个是业务的地方,也就是我们业务真正关系的地方的线程切换

复制代码
Observable.create(object : ObservableOnSubscribe<Int> {
            override fun subscribe(emitter: ObservableEmitter<Int>) {
                Log.d(TAG, "======== subscribe 当前线程是${Thread.currentThread().name} ")

                emitter.onNext(1)
            }

        }).observeOn(AndroidSchedulers.mainThread())
            .observeOn(Schedulers.io())
            .subscribe(MyObserver())

对于这种多次切换的时候,那么看日志

======== setOnObservableAssembly apply

2023-10-10 20:08:28.113 10087-10087 com.exampl...deActivity com.example.myapplication D ======== setOnObservableAssembly apply

2023-10-10 20:08:28.117 10087-10087 com.exampl...deActivity com.example.myapplication D ======== onSubscribe 当前线程是main

2023-10-10 20:08:28.117 10087-10087 com.exampl...deActivity com.example.myapplication D ======== subscribe 当前线程是main

2023-10-10 20:08:28.301 10087-10132 com.exampl...deActivity com.example.myapplication D ======== onNext value = 1 当前线程是RxCachedThreadScheduler-1

最后左右一次切换生效到最终的业务上

相关推荐
爱笑鱼1 小时前
Binder(二):AIDL 生成的 Proxy、Stub 和 Parcel 到底在做什么?
android
爱笑鱼2 小时前
Binder(一):一次方法调用,究竟怎样跨进程执行?
android
壮哥_icon2 小时前
【Android 系统开发】使用 BAT 脚本高效自动化管理 /system/priv-app/ 系统应用(安装与卸载)
android·运维·自动化
用户69371750013844 小时前
Claude Code终端日志Token占用实测:一个过滤器砍掉60%-90%
android·前端·后端
蝉蜕日记4 小时前
AccumuPDF高级版 v2.57 | 视图文转换PDF,合并分割压缩
android·智能手机·pdf·生活·软件需求
吐了啊取名字太难4 小时前
美颜系统AI修图本地跑并支持Mac、win、安卓、iOS不卡顿
android·人工智能·windows·数码相机·mac·ai编程
阿pin5 小时前
Android随笔-Retrofit
android·retrofit
想取一个与众不同的名字好难6 小时前
安卓自定义颜色选择器
android
我命由我123456 小时前
Android 开发问题:java.lang.NoSuchMethodError:No virtual method readAllBytes()
android·java·java-ee·kotlin·android studio·android-studio·android runtime
李艺为6 小时前
展锐相机DreamCamera2模式精简
android·java