RxJava 源码 解读

RxJava 源码解读
一直以来在网上看到关于RxJava的使用博客都称赞RxJava使用起来非常简洁,即使业务逻辑非常复杂,它依然能够保持简洁。于是在个人项目也添加了RxJava和RxAndroid.秉着知其然知其所以然的态度,跟着调用方法一探其源码,

首选是调用方法。这个方法是获取手机里面的所有音乐文件信息,并且返回给回调者,并且这里的subscribe是运行在子线程中,回调则在主线程再更新UI

public void sortMp3InfosByTitleByRx(BaseObserver<List<MusicInfo>> receiver)
    Observable.create(new ObservableOnSubscribe<List<MusicInfo>>() {
            @Override
            public void subscribe(ObservableEmitter<List<MusicInfo>> observableEmitter) throws Exception {
                MusicInfoDao dao=daoSession.getMusicInfoDao();
                DebugLog.d("subscribe:"+Thread.currentThread().getName());
                List<MusicInfo> list=dao.queryBuilder().orderAsc(com.music.bean.MusicInfoDao.Properties.TitleKey).list();
                if (list.isEmpty()){
                    DebugLog.d("本地数据没有,去手机多媒体数据库查询");
                    list.addAll(MusicModel.getInstance().sortMp3InfosByTitle(MusicApplication.getInstance()));
                }else{
                    DebugLog.d("从本地数据库获取 ");
                    MusicModel.getInstance().getMusicList().addAll(list);
                }
                musicInfoList.addAll(list);
                observableEmitter.onNext(list);
                observableEmitter.onComplete();
            }

        }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(receiver);

回调者封装了一个BaseObserver,因为有时候你只需要其中某一个回调就够了,

public class BaseObserver<T> implements Observer<T> {
    @Override
    public void onSubscribe(Disposable disposable) {
        DebugLog.d("onSubscribe:"+disposable.toString());
        DebugLog.d(Thread.currentThread().getName());
    }

    @Override
    public void onNext(T t) {
        DebugLog.d("onNext");
        DebugLog.d(Thread.currentThread().getName());
    }

    @Override
    public void onError(Throwable throwable) {
        DebugLog.d("onError");
    }

    @Override
    public void onComplete() {
        DebugLog.d("onComplete");
        DebugLog.d(Thread.currentThread().getName());
    }
}

receiver 是一个BaseObserver子类
其打印如下,正如所想,获取数据在子线程中,回调给调用者回到了主线程
这里写图片描述
这里写图片描述
那问题来了,这么几行代码如何切换线程?好像我们在获取数据的时候回调了onNext方法和onComplete方法,怎么获取数据的时候是在子线程,而真正给回调者的onNext方法和onComplete方法怎么又到主线程了?注意到说的是真正onNext方法和onComplete方法,而不是我们在获取数据的时候调用了onNext和onComplete。

这些都将在我们查看源码后一一知晓,刚开始第一遍看源码后,就好像陷入迷雾森林找不到方法一样,这种感觉是上次看startActivity一样的感觉,但是后面在反复从头查看并且做标记之后,看到后面不解在回过头看,然后连起来解读,顿时看透其中原理,简直有种酣畅淋漓之感,并且感叹写出这个代码人之牛逼哄哄。

下面解读的是基本的用法的源码,当然还有高级的用法,后面有时间再查看。

create方法

Observable.java

public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
    ObjectHelper.requireNonNull(source, "source is null");
    return RxJavaPlugins.onAssembly(new ObservableCreate(source));
}

create方法传入的是我们的创建的ObservableOnSubscribe对象,并且在subscribe方法里面有我们的业务逻辑,create方法里面把我们创建的ObservableOnSubscribe对象包装到ObservableCreate对象
ObservableOnSubscribe是Observable的子类,并且ObservableCreate也是Observable的子类 这个也比较重要,后面我们分析完再来说明。

public final class ObservableCreate<T> extends Observable<T> {
    final ObservableOnSubscribe<T> source;

public ObservableCreate(ObservableOnSubscribe<T> source) {
    this.source = source;
}

可以看到里面有个source属性就是创建对象传入的参数,后面的依然类似,创建对象是传入的参数大都赋值到对象里面的souce

RxJavaPlugins onAssembly方法

public static <T> Observable<T> onAssembly(@NonNull Observable<T> source) {
    Function<? super Observable, ? extends Observable> f = onObservableAssembly;
    return f != null?(Observable)apply(f, source):source;
}

onObservableAssembly是调用setOnObservableAssembly方法设置的

public static void setOnObservableAssembly(@Nullable Function<? super Observable, ? extends Observable> onObservableAssembly) {
    if(lockdown) {
        throw new IllegalStateException("Plugins can't be changed anymore");
    } else {
        onObservableAssembly = onObservableAssembly;
    }
}

我们没有调用这个方法因此这个对象为Null

public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
    ObjectHelper.requireNonNull(source, "source is null");
    return RxJavaPlugins.onAssembly(new ObservableCreate(source));
}

RxJavaPlugins onAssembly方法 返回的就是ObservableCreate对象
基本上RxJavaPlugins onAssembly方法返回的对象就是传入的对象
执行完create方法后返回的是ObservableCreate对象,里面的source就是我们创建的ObservableOnSubscribe对象

subscribeOn方法

2 create之后就是subscribeOn,因为我想我的业务逻辑运行在子线程中,因此调用了subscribeOn(Schedulers.io())方法。
查看subscribeOn方法,此方法传入一个Scheduler对象

public final Observable<T> subscribeOn(Scheduler scheduler) {
    ObjectHelper.requireNonNull(scheduler, "scheduler is null");
    return RxJavaPlugins.onAssembly(new ObservableSubscribeOn(this, scheduler));
}

ObservableSubscribeOn构造器把当前对象和我们创建的Schedulers.io()对象也传入进去,猜想这个应该就是根据我们设置的线程,在我们设置的线程里面执行我们的方法,ObservableSubscribeOn类继承了AbstractObservableWithUpstream类,而AbstractObservableWithUpstream类继承Observable类

public ObservableSubscribeOn(ObservableSource<T> source, Scheduler scheduler) {
    super(source);
    this.scheduler = scheduler;
}

也就是说ObservableSubscribeOn也是Observable的子类
执行完subscribeOn方法后返回的是ObservableSubscribeOn对象,里面的source是前面的ObservableCreate对象,scheduler是Schedulers.io()的,

observeOn方法

由于我们想要最终回调到主线程中,因此调用了observeOn(AndroidSchedulers.mainThread())方法

public final Observable<T> observeOn(Scheduler scheduler) {
    return this.observeOn(scheduler, false, bufferSize());
}

该方法调用了重载方法

public final Observable<T> observeOn(Scheduler scheduler, boolean delayError, int bufferSize) {
    ObjectHelper.requireNonNull(scheduler, "scheduler is null");
    ObjectHelper.verifyPositive(bufferSize, "bufferSize");
    return RxJavaPlugins.onAssembly(new ObservableObserveOn(this, scheduler, delayError, bufferSize));
}

这个和前面那个设置线程的基本都差不多,同样的ObservableObserveOn也是Observable的子类

public final class ObservableObserveOn<T> extends   AbstractObservableWithUpstream<T, T> {
    final Scheduler scheduler;
    final boolean delayError;
    final int bufferSize;

public ObservableObserveOn(ObservableSource<T> source, Scheduler scheduler, boolean delayError, int bufferSize) {
    super(source);
    this.scheduler = scheduler;
    this.delayError = delayError;
    this.bufferSize = bufferSize;
}

同样的ObservableObserveOn也是Observable的子类
执行完observeOn方法后返回的是ObservableObserveOn对象,里面的source是前面的ObservableSubscribeOn对象,scheduler是AndroidSchedulers.mainThread()生成的对象
看最后的subscribe方法

onSubscribe方法

4 到最后执行了subscribe方法,也就是封装到最后一个对象执行此方法,RxJavaPlugins.onSubscribe(this, observer)返回的就是传入的observer对象;最后执行了subscribeActual方法

public final void subscribe(Observer<? super T> observer) {
    ObjectHelper.requireNonNull(observer, "observer is null");

    try {
        observer = RxJavaPlugins.onSubscribe(this, observer);
        ObjectHelper.requireNonNull(observer, "Plugin returned null Observer");
        this.subscribeActual(observer);
    } catch (NullPointerException var4) {
        throw var4;
    } catch (Throwable var5) {
        Exceptions.throwIfFatal(var5);
        RxJavaPlugins.onError(var5);
        NullPointerException npe = new NullPointerException("Actually not, but can't throw other exceptions due to RS");
        npe.initCause(var5);
        throw npe;
    }
}

执行subscribeActual方法时发现该方法是个抽象方法

protected abstract void subscribeActual(Observer<? super T> var1);

总结前面的
1. create方法把我们创建的ObservableOnSubscribe对象封装到ObservableCreate对象
2. subscribeOn方法把ObservableCreate对象封装到ObservableSubscribeOn对象
3. observeOn方法,把ObservableSubscribeOn对象封装到ObservableObserveOn对象
4. onSubscribe方法,其实就是调用ObservableObserveOn对象的方法了,该方法传入了一个Observer,这个Observer就是最后的BaseObserver回调对象
封装的顺序如下

我们创建的ObservableOnSubscribe->ObservableCreate->ObservableSubscribeOn->ObservableObserveOn,并且ObservableCreate,ObservableSubscribeOn,ObservableObserveOn都是Observable的子类

了解这个封装顺序很重要,因为下面的调用前面是一步一步往前回调的。
根据对象的封装情况,我们再从调用的顺序再一步一步往下分析
查看我们的代码,我也是把这个回调给调用者。先记着这个receiver就是我们自己的回调对象

public void sortMp3InfosByTitleByRx(BaseObserver<List<MusicInfo>> receiver){
    Observable.create(new ObservableOnSubscribe<List<MusicInfo>>() {
        @Override
        public void subscribe(ObservableEmitter<List<MusicInfo>> observableEmitter) throws Exception {
            MusicInfoDao dao=daoSession.getMusicInfoDao();
            DebugLog.d("subscribe:"+Thread.currentThread().getName());
            List<MusicInfo> list=dao.queryBuilder().orderAsc(com.music.bean.MusicInfoDao.Properties.TitleKey).list();
            if (list.isEmpty()){
                DebugLog.d("本地数据没有,去手机多媒体数据库查询");
                list.addAll(MusicModel.getInstance().sortMp3InfosByTitle(MusicApplication.getInstance()));
            }else{
                DebugLog.d("从本地数据库获取 ");
                MusicModel.getInstance().getMusicList().addAll(list);
            }
            musicInfoList.addAll(list);
            observableEmitter.onNext(list);
            observableEmitter.onComplete();
        }

    }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(receiver);
}

由前面分析得知,此时执行subscribe方法的是一个ObservableObserveOn对象,因此我们继续查看
ObservableObserveOn对象里面的subscribe方法,发现里面没有这个方法,查看父类AbstractObservableWithUpstream,里面也没有这个方法,继续父类Observable,里面有这个方法

总结:Observable子类调用subscribe方法,如果没有复写该方法,最终都是自己subscribeActual方法

@SchedulerSupport("none")
public final void subscribe(Observer<? super T> observer) {
    ObjectHelper.requireNonNull(observer, "observer is null");

    try {
        observer = RxJavaPlugins.onSubscribe(this, observer);
        ObjectHelper.requireNonNull(observer, "Plugin returned null Observer");
        this.subscribeActual(observer);
    } catch (NullPointerException var4) {
        throw var4;
    } catch (Throwable var5) {
        Exceptions.throwIfFatal(var5);
        RxJavaPlugins.onError(var5);
        NullPointerException npe = new NullPointerException("Actually not, but can't throw other exceptions due to RS");
        npe.initCause(var5);
        throw npe;
    }
}

查看ObservableObserveOn的subscribeActual方法,这个observer是我们传入的revicer对象,由前面分析得知,ObservableObserveOn里面的source是ObservableSubscribeOn对象,这个source对象就是ObservableSubscribeOn对象,因此这里又回调了ObservableSubscribeOn对象的subscribe方法,并且还创建了一个Worker对象,把我们的revicer对象封装到一个ObservableObserveOn.ObserveOnObserver对象里。

ObservableObserveOn的subscribeActual方法

protected void subscribeActual(Observer<? super T> observer) {
    if(this.scheduler instanceof TrampolineScheduler) {
        this.source.subscribe(observer);
    } else {
        Worker w = this.scheduler.createWorker();
        this.source.subscribe(new ObservableObserveOn.ObserveOnObserver(observer, w, this.delayError, this.bufferSize));
    }

}

这里的scheduler是rxandroid包下面的HandlerScheduler类
HandlerScheduler 笔记
而这里创建一个worker对象

private static final class HandlerWorker extends Worker {
    public Disposable schedule(Runnable run, long delay, TimeUnit unit) {
        if(run == null) {
            throw new NullPointerException("run == null");
        } else if(unit == null) {
            throw new NullPointerException("unit == null");
        } else if(this.disposed) {
            return Disposables.disposed();
        } else {
            run = RxJavaPlugins.onSchedule(run);
            HandlerScheduler.ScheduledRunnable scheduled = new HandlerScheduler.ScheduledRunnable(this.handler, run);
            Message message = Message.obtain(this.handler, scheduled);
            message.obj = this;
            this.handler.sendMessageDelayed(message, unit.toMillis(delay));
            if(this.disposed) {
                this.handler.removeCallbacks(scheduled);
                return Disposables.disposed();
            } else {
                return scheduled;
            }
        }
    }

    public void dispose() {
        this.disposed = true;
        this.handler.removeCallbacksAndMessages(this);
    }

    public boolean isDisposed() {
        return this.disposed;
    }
}

这个类主要看schedule方法,很显然是利用handler回调到主线程,这里暂且先不管这个类,后面调用的时候再回过来看。

继续看ObservableObserveOn的subscribeActual方法

protected void subscribeActual(Observer<? super T> observer) {
    if(this.scheduler instanceof TrampolineScheduler) {
        this.source.subscribe(observer);
    } else {
        Worker w = this.scheduler.createWorker();
        this.source.subscribe(new ObservableObserveOn.ObserveOnObserver(observer, w, this.delayError, this.bufferSize));
    }

}

既然这个source是ObservableSubscribeOn对象,而这个ObservableSubscribeOn对象也是Observable的子类,由我们前面的分析得知,如果是Observable的子类,调用subsribe方法,就是调用subsribeActual方法,因此我们直接看ObservableSubscribeOn对象的subsribeActual方法,

ObservableSubscribeOn对象的subsribeActual方法

public void subscribeActual(Observer<? super T> s) {
    ObservableSubscribeOn.SubscribeOnObserver<T> parent = new ObservableSubscribeOn.SubscribeOnObserver(s);
    s.onSubscribe(parent);
    parent.setDisposable(this.scheduler.scheduleDirect(new ObservableSubscribeOn.SubscribeTask(parent)));
}

这个SubscribeOnObserver类基本上就是对传入的s对象做了代理
查看s.onSubscribe方法,这个s就是前面ObservableObserveOn.ObserveOnObserver对象,该对象里面有我们的receiver对象和一个AndroidSchedulers.mainThread()生成的Worker对象
查看ObservableObserveOn.ObserveOnObserver对象的onSubscribe方法方法,由于传入进去的parent对象并不是QueueDisposable的子类,因此不会进入if语句里面,查看this.actual.onSubscribe(this);这个actual就是构造器时传入的对象,也就是我们的回调对象。

public void onSubscribe(Disposable s) {
        if(DisposableHelper.validate(this.s, s)) {
            this.s = s;
            if(s instanceof QueueDisposable) {
                QueueDisposable<T> qd = (QueueDisposable)s;
                int m = qd.requestFusion(7);
                if(m == 1) {
                    this.sourceMode = m;
                    this.queue = qd;
                    this.done = true;
                    this.actual.onSubscribe(this);
                    this.schedule();
                    return;
                }

                if(m == 2) {
                    this.sourceMode = m;
                    this.queue = qd;
                    this.actual.onSubscribe(this);
                    return;
                }
            }

            this.queue = new SpscLinkedArrayQueue(this.bufferSize);
            this.actual.onSubscribe(this);
        }

    }

到这里就调用了我们BaseObserver的onSubscribe方法,再看后面是啥时候调用其他方法的

继续看subscribeActual的方法,执行完s.onSubscribe(parent);后执行
parent.setDisposable(this.scheduler.scheduleDirect(new ObservableSubscribeOn.SubscribeTask(parent)));

ObservableSubscribeOn对象的subsribeActual方法

public void subscribeActual(Observer<? super T> s) {
    ObservableSubscribeOn.SubscribeOnObserver<T> parent = new ObservableSubscribeOn.SubscribeOnObserver(s);
    s.onSubscribe(parent);
    parent.setDisposable(this.scheduler.scheduleDirect(new ObservableSubscribeOn.SubscribeTask(parent)));
}

这里的s就是是ObservableObserveOn.ObserveOnObserver对象,该对象里面有我们的receiver对象和一个AndroidSchedulers.mainThread()生成的Worker对象

parent把前面的传入的参数s进行一个封装,里面调用方法基本也就是调用s的方法

这里又把parent封装到ObservableSubscribeOn.SubscribeTask对象里,

ObservableSubscribeOn.SubscribeTask实现了Runnable接口,那主要代码在run方法里面,

run方法执行了ObservableSubscribeOn里面source的subscribe方法。我们知道ObservableSubscribeOn里面封装的是ObservableCreate对象,因此这个方法里面调用的ObservableCreate对象的subscribe方法,这个我们先放着,看后面的代码是怎么切换线程的并且调用这个run方法的
SubscribeTask 笔记
final class SubscribeTask implements Runnable {
private final ObservableSubscribeOn.SubscribeOnObserver parent;

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

    public void run() {
        ObservableSubscribeOn.this.source.subscribe(this.parent);
    }
}

继续查看scheduler对象的scheduleDirect方法

先看schedule怎么创建的
这个scheduler是创建ObservableSubscribeOn对象时创建的,找到前面创建ObservableSubscribeOn对象的代码

public final Observable<T> observeOn(Scheduler scheduler) {
    return this.observeOn(scheduler, false, bufferSize());
}

该方法调用了重载方法

public final Observable<T> observeOn(Scheduler scheduler, boolean delayError, int bufferSize) {
    ObjectHelper.requireNonNull(scheduler, "scheduler is null");
    ObjectHelper.verifyPositive(bufferSize, "bufferSize");
    return RxJavaPlugins.onAssembly(new ObservableObserveOn(this, scheduler, delayError, bufferSize));
}

创建new ObservableObserveOn(this, scheduler, delayError, bufferSize),时这个scheuler就是我们调用Schedulers.io()传入进去的。

scheduler的scheduleDirect方法

@NonNull
public Disposable scheduleDirect(@NonNull Runnable run, long delay, @NonNull TimeUnit unit) {
    Scheduler.Worker w = this.createWorker();
    Runnable decoratedRun = RxJavaPlugins.onSchedule(run);
    Scheduler.DisposeTask task = new Scheduler.DisposeTask(decoratedRun, w);
    w.schedule(task, delay, unit);
    return task;
}

Scheduler主要是调用其createWorker生成的Worker对象的schedule的方法.而我们用的是Schedulers.io()生成的是NewThreadScheduler类
NewThreadScheduler类的创建的是一个NewThreadWorker。

@NonNull
public Worker createWorker() {
    return new NewThreadWorker(this.threadFactory);
}

NewThreadWorker类的schedule方法,调用了重载方法,重载方法调用了scheduleActual方法

@NonNull
public Disposable schedule(@NonNull Runnable run) {
    return this.schedule(run, 0L, (TimeUnit)null);
}

@NonNull
public Disposable schedule(@NonNull Runnable action, long delayTime, @NonNull TimeUnit unit) {
    return (Disposable)(this.disposed?EmptyDisposable.INSTANCE:this.scheduleActual(action, delayTime, unit, (DisposableContainer)null));
}
@NonNull
public ScheduledRunnable scheduleActual(Runnable run, long delayTime, @NonNull TimeUnit unit, @Nullable DisposableContainer parent) {
    Runnable decoratedRun = RxJavaPlugins.onSchedule(run);
    ScheduledRunnable sr = new ScheduledRunnable(decoratedRun, parent);
    if(parent != null && !parent.add(sr)) {
        return sr;
    } else {
        try {
            Object f;
            if(delayTime <= 0L) {
                f = this.executor.submit(sr);
            } else {
                f = this.executor.schedule(sr, delayTime, unit);
            }

            sr.setFuture((Future)f);
        } catch (RejectedExecutionException var10) {
            if(parent != null) {
                parent.remove(sr);
            }

            RxJavaPlugins.onError(var10);
        }

        return sr;
    }
}

再看前面 调用的代码

ObservableSubscribeOn对象的subsribeActual方法,

public void subscribeActual(Observer<? super T> s) {
    ObservableSubscribeOn.SubscribeOnObserver<T> parent = new ObservableSubscribeOn.SubscribeOnObserver(s);
    s.onSubscribe(parent);
    parent.setDisposable(this.scheduler.scheduleDirect(new ObservableSubscribeOn.SubscribeTask(parent)));
}

ObservableSubscribeOn.SubscribeTask是一个实现了Runnable的子类,而调用这个scheduler的里面的Worker对象就是NewThreadWorker,这个对象里面有个线程池,运行在这里的代码都是在子线程中进行的,ObservableSubscribeOn.SubscribeTask根据时间是否直接提交到线程池中,还是延迟提交。

前面在SubscribeTask 笔记记录,现在这里的参数run就是前面的SubscribeTask对象,这里又封装成一个ScheduledRunnable对象,不过这个ScheduledRunnable对象调用的也是传入run的方法。
再查看SubscribeTask类,调用的是ObservableSubscribeOn里面source对象的方法, 也就是ObservableCreate的方法

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

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

    public void run() {
        ObservableSubscribeOn.this.source.subscribe(this.parent);
    }
}

根据前面总结得知,调用subscribe方法就是调用ObservableCreate的subscribeActual方法

ObservableCreate的subscribeActual方法

protected void subscribeActual(Observer<? super T> observer) {
    ObservableCreate.CreateEmitter<T> parent = new ObservableCreate.CreateEmitter(observer);
    observer.onSubscribe(parent);

    try {
        this.source.subscribe(parent);
    } catch (Throwable var4) {
        Exceptions.throwIfFatal(var4);
        parent.onError(var4);
    }

}

这里继续调用的source,也就是我们自己创建的一个ObservableOnSubscribe

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值