Rxjava浅谈

68 阅读2分钟

原理:

先看图:

4314397-f7292fb702c44141.webp

结论:分为两个方向:第一就是没订阅之前第二订阅之后,没订阅之前就是上图中的黑色图,每调用一个操作符,这个操作符就持有上一个操作符所创建的observalbe(如map创建的observalbeMap 就是个代理)就这么一层一层往下包装下去,直到最后一个map调用了订阅方法,注意,没有订阅之前所有操作符中的代码都不会执行的除了(compose),由于持有上源那么就会一层层从最后往上找最后就会执行第一个Obserabel的 订阅方法,在这个订阅方法中就会执行已经经过各个操作包装好的Observer的就会一层层剥开Observe,最终代用订阅的oberver中的oNext 方法

两句话总结:

顺流而下:操作符的调用如* *map的调用就是一层层往下传递源 方便订阅的时候反着找到源头

逆流而上:就是拿到* *observer经过一层层包装把map的转换方法都封装里面,到源头时就一层层拆分调用订阅者的方法

compose操作符

Compose 是操作被观察者的   其他操作符是操作观察者的

compose()是唯一一个能够从数据流中得到原始Observable的操作符,(也就可以订阅之前拦截操作上一个被观察者代理)

compose看这篇文章: blog.csdn.net/jdsjlzx/art…

看下面代码:

Observable.*just*("XXXX").map(new Function<String, String>() {  
    @Override  
    public String apply(String s) throws Exception {  
        Log.*e*("onsucess1","MAP1----"+Thread.*currentThread*().getName());  
        return "";  
    }  
}).compose(new ObservableTransformer<String, String>() {  
    @Override  
    public ObservableSource<String> apply(Observable<String> upstream) {  
        Log.*e*("onsucess1","compose----"+Thread.*currentThread*().getName());  
        Observable<String> stringObservable = upstream.subscribeOn(Schedulers.*io*());  
        return stringObservable ;  
    }  
}).map(new Function<String, Object>() {  
    @Override  
    public Object apply(String s) throws Exception {  
        Log.*e*("onsucess1","MAP2----"+Thread.*currentThread*().getName());  
        return null;  
    }  
})

返回: 2023-01-06 22:05:38.386 6455-6455/com.key.calc.retrofit E/onsucess1: compose----main

2023-01-06 22:05:38.389 6455-6478/com.key.calc.retrofit E/onsucess1: MAP1----RxCachedThreadScheduler-2

2023-01-06 22:05:38.389 6455-6478/com.key.calc.retrofit E/onsucess1: MAP2----RxCachedThreadScheduler-2

线程调度:

subscribeOn():设置源头也就是最开始的被观察者的订阅方法所执行的线程,位置随便,以最靠近源头的为准,也就是位置上游会覆盖下游

observeOn():设置观察者onNext所执行的线程 ,设置作用域为observeOn()位置往下的位置,如果下流还有一个observeOn()以这个往下的线程以这个observeOn()线程为准

结论:subscribeOn()指定了最开始执行线程,如果不改变则全部执行以这个指定为准,observeOn()可在流的任意位置改变线程