RxJava源码解析

1、基本原理

RxJava基本原理分析

https://www.jianshu.com/p/88aacbed8aa5

 

示例

Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                KLog.e(TAG, "1");
                emitter.onNext("1");
            }
        }).doOnNext(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                KLog.e(TAG, "2");
            }
        }).map(new Function<String, Boolean>() {
            @Override
            public Boolean apply(String resultTMPResult) throws Exception {
                KLog.e(TAG, "4");
                return true;
            }
        }).subscribe(new Consumer<Boolean>() {
            @Override
            public void accept(Boolean aBoolean) throws Exception {
                KLog.e(TAG, "5");
            }
        });

 

 

从上向下执行,逐个初始化各个Observable,保存上级关系属性Source

ObservableCreate
ObservableDoOnEach
ObservableMap

以上均继承Observable抽象类,是Observable的子类。


各Observable的具体子类的属性中,

Source代表上一级的被观察者。 

对象本身 是相对上一级的观察者、和相对下一级的被观察者。

t/actual/downstream代表下一级的观察者

 

public abstract class Observable<T> implements ObservableSource<T> {
   //Observable实现ObservableSource接口
    @Override
    public final void subscribe(Observer<? super T> observer) {
        //调用每个Observable子类的subscribeActual实现方法
        subscribeActual(observer);
    }
}

//
public interface ObservableSource<T> {
    //上一级订阅本级
    void subscribe(@NonNull Observer<? super T> observer);
}

 

最后执行到subscribe()方法时,会最终调用Observable.subscribeActual()抽象方法。

触发依次向上执行。

ObservableMap的subscribeActual()方法。

source.subscribe(new MapObserver<T, U>(t, function));

上一级Observable订阅包含下一级Observer对象的本级Observer

    @Override
    public void subscribeActual(Observer<? super U> t) {
        KLog.e(TAG,"subscribeActual");
        source.subscribe(new MapObserver<T, U>(t, function));
    }

ObservableDoOnEach的subscribeActual()方法

    @Override
    public void subscribeActual(Observer<? super T> t) {
        KLog.e(TAG,"subscribeActual");
        source.subscribe(new DoOnEachObserver<T>(t, onNext, onError, onComplete, onAfterTerminate));
    }

ObservableCreate的subscribeActual()方法

    @Override
    protected void subscribeActual(Observer<? super T> observer) {
        KLog.e(TAG,"subscribeActual");
        CreateEmitter<T> parent = new CreateEmitter<T>(observer);
        KLog.e(TAG,"subscribeActual onSubscribe");
        observer.onSubscribe(parent);

        try {
            KLog.e(TAG,"subscribeActual subscribe");
            source.subscribe(parent);
        } catch (Throwable ex) {
            Exceptions.throwIfFatal(ex);
            parent.onError(ex);
        }
    }

ObservableCreate中的subscribeActual方法,会首先调用observer.onSubscribe(parent),依次向下触发已订阅的回调。

然后调用source.subscribe(parent)方法,触发create原始接口回调的业务内容,结束后调用emitter.onNext(),触发下一级onNext()方法。

以ObservableDoOnEach的onNext()为例,上一级触发onNext()后,先执行本级的onNext(),再执行下一级的onNext()。

        @Override
        public void onNext(T t) {
            if (done) {
                return;
            }
            try {
                KLog.e(TAG,"onNext1");
                onNext.accept(t);//本机业务
            } catch (Throwable e) {
                Exceptions.throwIfFatal(e);
                upstream.dispose();
                onError(e);
                return;
            }

            KLog.e(TAG,"onNext2");
            downstream.onNext(t);//触发下一级
        }

 

 

初始化:由上到下。

订阅:从下到上。

业务执行:从上到下。

 

2、切换线程

详解 RxJava2 的线程切换原理

https://www.jianshu.com/p/a9ebf730cd08

 

示例

Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                KLog.e(TAG, "1=" + Thread.currentThread());
                emitter.onNext("aaa");
            }
        }).doOnNext(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                KLog.e(TAG, "2=" + Thread.currentThread());
            }
        }).subscribeOn(Schedulers.io()).map(new Function<String, Boolean>() {
            @Override
            public Boolean apply(String resultTMPResult) throws Exception {
                KLog.e(TAG, "3=" + Thread.currentThread());
                return true;
            }
        }).doOnNext(new Consumer<Boolean>() {
            @Override
            public void accept(Boolean s) throws Exception {
                KLog.e(TAG, "4=" + Thread.currentThread());
            }
            //切换线程
        }).observeOn(Schedulers.newThread()).doOnNext(new Consumer<Boolean>() {
            @Override
            public void accept(Boolean aBoolean) throws Exception {
                KLog.e(TAG, "5=" + Thread.currentThread());
            }
        }).subscribe(new Consumer<Boolean>() {
            @Override
            public void accept(Boolean aBoolean) throws Exception {
                KLog.e(TAG, "6=" + Thread.currentThread());
            }
        });

结果:

1=Thread[RxCachedThreadScheduler-1,5,main]
2=Thread[RxCachedThreadScheduler-1,5,main]
3=Thread[RxCachedThreadScheduler-1,5,main]
4=Thread[RxCachedThreadScheduler-1,5,main]
5=Thread[RxNewThreadScheduler-1,5,main]
6=Thread[RxNewThreadScheduler-1,5,main]

 

订阅切换线程 :

subscribeOn(Schedulers.io()) 生成ObservableSubscribeOn类

public final class ObservableSubscribeOn<T> extends AbstractObservableWithUpstream<T, T> {   
    @Override
    public void subscribeActual(final Observer<? super T> observer) {
        final SubscribeOnObserver<T> parent = new SubscribeOnObserver<T>(observer);

        //触发订阅回调
        observer.onSubscribe(parent);

        //切换线程
        parent.setDisposable(scheduler.scheduleDirect(new SubscribeTask(parent)));
    }
}

static final class SubscribeOnObserver<T> extends AtomicReference<Disposable> implements Observer<T>, Disposable {

        @Override
        public void onSubscribe(Disposable d) {
            //订阅回调,Disposable d实际是上一级对象的Disposable。用于取消订阅使用
            DisposableHelper.setOnce(this.upstream, d);
        }

        @Override
        public void onNext(T t) {
            //上一级已切换线程,这里不切换线程,直接执行下一级onNext()
            downstream.onNext(t);
        }

}


public abstract class Scheduler {

    @NonNull
    public Disposable scheduleDirect(@NonNull Runnable run, long delay, @NonNull TimeUnit unit) {
        //新建工作线程
        final Worker w = createWorker();

        final Runnable decoratedRun = RxJavaPlugins.onSchedule(run);

        DisposeTask task = new DisposeTask(decoratedRun, w);

        w.schedule(task, delay, unit);

        return task;
    }
}

    final class SubscribeTask implements Runnable {
        private final SubscribeOnObserver<T> parent;

        SubscribeTask(SubscribeOnObserver<T> parent) {
            this.parent = parent;
        }

        @Override
        public void run() {
            //在新线程里订阅
            source.subscribe(parent);
        }
    }

 

观察切换线程:

observeOn(Schedulers.newThread())生成ObservableObserveOn类

public final class ObservableObserveOn<T> extends AbstractObservableWithUpstream<T, T> {

    @Override
    protected void subscribeActual(Observer<? super T> observer) {
        //新建线程
        Scheduler.Worker w = scheduler.createWorker();

        //订阅不切换线程,观察对象中传入新建线程
        source.subscribe(new ObserveOnObserver<T>(observer, w, delayError, bufferSize));
    }
}

  static final class ObserveOnObserver<T> extends BasicIntQueueDisposable<T>
    implements Observer<T>, Runnable {


        @Override
        public void onNext(T t) {
            //切换线程执行
            schedule();
        }

        void schedule() {
            if (getAndIncrement() == 0) {
                //切换线程执行下一级onNext()
                worker.schedule(this);
            }
        }

  }

 

RxJava中的flatMap操作符是一个非常常用的操作符,它可以将一个Observable发射的事件序列转换成多个Observables,然后将这些Observables发射的事件序列合并后再发射出去。 下面是flatMap操作符的源码解析: ```java public final <R> Observable<R> flatMap(Function<? super T, ? extends ObservableSource<? extends R>> mapper) { ObjectHelper.requireNonNull(mapper, "mapper is null"); return RxJavaPlugins.onAssembly(new ObservableFlatMap<>(this, mapper, false, Integer.MAX_VALUE, bufferSize())); } ``` 可以看到,flatMap操作符的实现是通过创建一个ObservableFlatMap对象来完成的。其中,mapper参数表示将原始Observable发射的事件转换成的新Observable,它是一个Function类型的参数,即接受一个T类型的参数并返回一个ObservableSource类型的结果。 ObservableFlatMap的构造函数如下所示: ```java ObservableFlatMap(ObservableSource<T> source, Function<? super T, ? extends ObservableSource<? extends R>> mapper, boolean delayErrors, int maxConcurrency, int bufferSize) { this.source = source; this.mapper = mapper; this.delayErrors = delayErrors; this.maxConcurrency = maxConcurrency; this.bufferSize = bufferSize; } ``` ObservableFlatMap的核心实现是在subscribeActual方法中完成的: ```java @Override public void subscribeActual(Observer<? super R> observer) { if (ObservableScalarXMap.tryScalarXMapSubscribe(source, observer, mapper)) { return; } source.subscribe(new FlatMapObserver<>(observer, mapper, delayErrors, maxConcurrency, bufferSize)); } ``` 在subscribeActual方法中,首先判断源Observable是否可以直接转换为ObservableScalarXMap,如果可以的话直接进行转换,否则创建一个FlatMapObserver对象并进行订阅。 FlatMapObserver是flatMap的核心实现类,它实现了Observer接口,并且在接收到源Observable发射的事件时,会先将事件转换成新的Observable,然后将新Observable的发射事件序列合并到一个新的Observable中,最后再将新的Observable发射出去。 ```java static final class FlatMapObserver<T, R> extends AtomicInteger implements Observer<T>, Disposable { // ... @Override public void onNext(T t) { ObservableSource<? extends R> o; try { o = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper returned a null ObservableSource"); } catch (Throwable e) { Exceptions.throwIfFatal(e); upstream.dispose(); onError(e); return; } if (cancelled) { return; } if (maxConcurrency != Integer.MAX_VALUE) { synchronized (this) { if (wip == maxConcurrency) { queue.offer(t); return; } wip++; } } o.subscribe(new InnerObserver(inner, delayErrors, this)); } // ... } ``` 在FlatMapObserver的onNext方法中,首先调用mapper将源Observable发射的事件转换成新的Observable,并进行非空检查。然后判断当前的并发度是否达到了最大值,如果达到了最大值,就将源Observable发射的事件放到队列中。否则,就将并发度加1,并订阅新Observable。 InnerObserver是FlatMapObserver的内部类,它实现了Observer接口,并在接收到来自新Observable的发射事件序列时,将它们合并到一个新的Observable中,并将新的Observable发射出去。 ```java static final class InnerObserver<R> implements Observer<R> { // ... @Override public void onNext(R t) { if (done) { return; } inner.onNext(t); } // ... } ``` 当所有的新Observable都完成后,FlatMapObserver会调用onComplete方法通知观察者。如果发生了异常,FlatMapObserver会调用onError方法通知观察者。同时,FlatMapObserver还实现了Disposable接口,可以通过dispose方法取消订阅。 综上所述,flatMap操作符的实现是比较复杂的,它通过创建ObservableFlatMap对象,并在subscribeActual方法中创建FlatMapObserver对象来完成转换操作。在FlatMapObserver中,它还需要实现对新Observable的订阅以及将新Observable发射的事件合并到一个新的Observable中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值