RxJava流程分析

764 阅读3分钟
  1. map和flatMap的区别,flatMap可以自己分发多个数据给下面 juejin.cn/post/684490…

  2. RxJava全局Hook

    RxJavaPlugins

    全局操作符打印,全局线程监听什么的,以下是全局错误处理:

    RxJavaPlugins.setErrorHandler(Consumer {
        LogUtil.d("RxJavaError:${it.message}")
    })
    
  3. RxJava线程变换

    Android主线程是通过Handler(真正的操作包装在Message中)

    子线程是通过线程池(真正的操作包装成Runnable中)

    流程:

    1. Scheduler调度者,传入不同的Scheduler来使用不同的线程

    2. 用Scheduler创建Work(内部类)来使用真正的线程池

    3. 传入具体的操作包装成Runnable

    4. 通过schedule方法来实现调度,worker.schedule

  1. doSubscribeOn

    doOnSubscribe 在哪个线程调用,就在那个线程,也可切换到其他线程,代码如下:

.doOnSubscribe(new Consumer<Disposable>() {
    @Override
    public void accept(Disposable disposable) throws Exception {
        System.out.println("==========jackie===doOnSubscribe======="+Thread.currentThread().getName());
    }
})
.subscribeOn(Schedulers.io())

//System.out: ==========jackie===doOnSubscribe=======RxCachedThreadScheduler-1
  1. Map转换流程

    Observable通过map()后返回一个ObservableMap,同时也会创建一个MapObserver(里面包装了Observer),调用订阅susbcribe()方法后,ObservableMap.onNext()-> apply()数据转换 -> Observer.onNext()

    如果有两个Map转换,流程

    Observable通过map()后返回一个ObservableMap1,同时也会创建一个MapObserver1(里面包装了Observer),又map()后返回一个ObservableMap2,同时也会创建一个MapObserver2(里面包装了MapObserver1),调用订阅susbcribe()方法后,MapObservaber1.onNext()-> apply1()数据转换 -> MapObservaber2.onNext()-> apply2()数据转换 -> Observer.onNext()

    onNext()方法里面有apply方法

代码的执行顺序一定是这样的,虽然MapObservaber2包裹着MapObserver1,但是MapObservaber1的onNext是先执行的,然后才是MapObservaber2的onNext(),然后才是原始的Observer的onNext

代码细节不重要,包装流程一定要清楚,不同Observer的onNext执行顺序要讲清楚,apply方法的执行顺序要讲清楚。

  1. 自己实现一个类似RxJava的观察者模式

    public interface Action1<T> {
    
        void call(T t);
    
    }
    
    public interface Callee<T> {
    
        void onNext(T t);
    
        void onError(Throwable t);
    
        void onComplete();
    
    }
    
    public class Caller<T> {
    
        final OnCall<T> mOnCall;
    
        public Caller(OnCall<T> onCall){
            this.mOnCall = onCall;
        }
    
        public static <T> Caller<T> create(OnCall<T> onCall){
            return new Caller(onCall);
        }
    
        public Calling call(Receiver receiver){
            this.mOnCall.call(receiver);
            return receiver;
        }
    
        public interface OnCall<T> extends Action1<Receiver<T>>{
    
        }
    }
    
    public interface Calling {
    
        void unCall();
    
        boolean isUnCalled();
    
    }
    
    public abstract class Receiver<T> implements Callee<T>,Calling{
    
        @Override
        public boolean isUnCalled() {
            return false;
        }
    
        @Override
        public void unCall() {
    
        }
    }
    

    实际调用:

     Receiver<String> receiver = new Receiver<String>() {
         @Override
         public void onNext(String o) {
    
         }
    
         @Override
         public void onError(Throwable t) {
    
         }
    
         @Override
         public void onComplete() {
    
         }
     };
    
    Caller.OnCall onCall = new Caller.OnCall<String>() {
        @Override
        public void call(Receiver<String> stringReceiver) {
            stringReceiver.onNext("123");
        }
    };
    
    //其实就是传进去一个实例,然后调用stringReceiver.onNext(Object o),具体的实现类中拿到值
    Calling calling = Caller.create(onCall).call(receiver);
    

类图关系如下:

  1. CreateEmitter数据处理器,本质是对Observer和Subscribe的包装

  2. compose操作符,可以封装一下线程变换的操作

  3. 背压Flowable操作,需要响应式拉取,s.requeset(Long.MAX_VALUE)

  4. RxJava的Single,Completable以及Maybe

    类型 描述
    Observable 能够发射0或n个数据,并以成功或错误事件终止。
    Flowable 能够发射0或n个数据,并以成功或错误事件终止。 支持Backpressure,可以控制数据源发射的速度。
    Single Single只能发射单个数据或错误事件
    Single中SingleObserver只有onSuccess,onError,并没有onComplete。这是Single跟其他的四种被观察者的最大区别。
    Single可以通过toXXX方法转换成Observable、Flowable、Completable以及Maybe
    Completable 它从来不发射数据,只处理 onComplete 和 onError 事件。可以看成是Rx的Runnable。
    Maybe 能够发射0或者1个数据,要么成功,要么失败。有点类似于Optional

    Completable

    Completable.fromAction(new Action() {
                @Override
                public void run() throws Exception {
    
                    System.out.println("Hello World");
                }
            }).subscribe();
    
    //Completable经常会结合andThen操作符
    Completable.create(new CompletableOnSubscribe() {
                @Override
                public void subscribe(@NonNull CompletableEmitter emitter) throws Exception {
    
                    try {
                        TimeUnit.SECONDS.sleep(1);
                        emitter.onComplete();
                    } catch (InterruptedException e) {
                        emitter.onError(e);
                    }
                }
            }).andThen(Observable.range(1, 10))
            .subscribe(new Consumer<Integer>() {
                @Override
                public void accept(@NonNull Integer integer) throws Exception {
                    System.out.println(integer);
                }
            });
    

参考文章:

www.jianshu.com/p/45309538a…

juejin.cn/post/684490…