Rxjava源码解析

Rxjava本质上是一个异步操作库。
是一个能让你用非常简单的逻辑 去处理那些繁琐复杂任务的 异步的操作库。

一、观察者模式

在正式分析Rxjava之前先简单看一下Rxjava中核心的一个观察者模式


观察者模式类图.png
  1. 被观察者
    Observerable
public interface Observerable {
    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyObservers();
}

ConcreteObserverable

public class ConcreteObserverable implements Observerable {

    private List<Observer> mObservers;
    private String msg;

    public ConcreteObserverable() {
        mObservers = new ArrayList<>();
    }

    @Override
    public void registerObserver(Observer o) {
        mObservers.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        int i = mObservers.indexOf(o);
        if(i >= 0)
            mObservers.remove(i);
    }

    @Override
    public void notifyObservers() {
        for(int i = 0; i < mObservers.size(); i++){
            Observer observer = mObservers.get(i);
            observer.update(msg);
        }
    }

    public void setMsg(String msg){
        this.msg = msg;
        //信息更新完毕,通知所有观察者
        notifyObservers();
    }

}
  1. 观察者
public interface Observer {
    public void update(String msg);
}

二、Rxjava使用

1、创建被观察者

  • create
 Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            subscriber.onNext("1");
            subscriber.onNext("2");
            subscriber.onCompleted();
        }
    });

  • just
 Observable observable = Observable.just("1", "2");
  • from
    String[] parameters = {"1", "2"};
    Observable observableFrom = Observable.from(parameters);

2、创建观察者

Observer<Object> observer = new Observer<Object>() {

        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(Object s) {

        }
    };

3、订阅

 observable.subscribe(observer); 

三、Observable被观察者

public class Observable<T> {
    // 创建时从外面传入,可以把他理解为观察者模式中的notify()方法 
    final OnSubscribe<T> onSubscribe;
    // 一个抽象的代理类,默认情况下不会对OnSubscribe做任何的处理
    static final RxJavaObservableExecutionHook hook = RxJavaPlugins.getInstance().getObservableExecutionHook();
    protected Observable(OnSubscribe<T> f) {
        this.onSubscribe = f;
    }
    //使用create完成被观察者的创建,把传入的OnSubscribe赋值给成员变量 
    public static <T> Observable<T> create(OnSubscribe<T> f) {
        // 默认情况下onCreate不会做任何处理直接将f返回
        return new Observable<T>(hook.onCreate(f));
    }
}

四、OnSubscribe

五、Observer/Subscriber观察者

观察者有Observer、Subscriber两个接口 ,Subscriber其实是对Observer的一个扩展 ,使用方式基本相同,使用时都会将Observer转换成Subscriber

 // 实现Observer和Subscription接口,Subscription只有两个方法void unsubscribe()和boolean isUnsubscribed()
public abstract class Subscriber<T> implements Observer<T>, Subscription {
    // 保存所有这个观察者订阅的事件,Subscription中的解除订阅也是删除这个集合中的被观察者
    private final SubscriptionList subscriptions;
    private final Subscriber<?> subscriber;
}

六、subscribe订阅

  • 订阅Observer:会把Observer转成Subscriber
    public final Subscription subscribe(final Observer<? super T> observer) {
        if (observer instanceof Subscriber) {
            return subscribe((Subscriber<? super T>)observer);
        }
        return subscribe(new Subscriber<T>() {

            @Override
            public void onCompleted() {
                observer.onCompleted();
            }

            @Override
            public void onError(Throwable e) {
                observer.onError(e);
            }

            @Override
            public void onNext(T t) {
                observer.onNext(t);
            }

        });
    }
  • 订阅Subscriber
    public final Subscription subscribe(Subscriber<? super T> subscriber) {
        return Observable.subscribe(subscriber, this);
    }
    
    private static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable) {
     // validate and proceed
        if (subscriber == null) {
            throw new IllegalArgumentException("observer can not be null");
        }
        if (observable.onSubscribe == null) {
            throw new IllegalStateException("onSubscribe function can not be null.");
        }
        
        // new Subscriber so onStart it
        subscriber.onStart();
        
        // if not already wrapped
        if (!(subscriber instanceof SafeSubscriber)) {
            // assign to `observer` so we return the protected version
            subscriber = new SafeSubscriber<T>(subscriber);
        }

        // The code below is exactly the same an unsafeSubscribe but not used because it would 
        // add a significant depth to already huge call stacks.
        try {
            // allow the hook to intercept and/or decorate
            // 调用call方法
            hook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber);
            return hook.onSubscribeReturn(subscriber);
        } catch (Throwable e) {
            return Subscriptions.unsubscribed();
        }
    }

七、操作符

变换:将事件序列中的对象或整个序列进行加工处理,转换成不同的对象或事件序列

1、map

把一个事件转换成为另一个事件

Observable.just("xxxx/map.png")
        .map(new Func1<String, Bitmap>() {
            @Override
            public Bitmap call(String filePath) {
                return getBitmap(filePath);
            }
        })
        .subscribe(new Action1<Bitmap>() {
            @Override
            public void call(Bitmap bitmap) {
                showBitmap(bitmap);
            }
        });

map()函数接收一个Func1类型的参数,然后把这个Func1应用到每一个由Observable发射的值上,将发射的值转换为我们期望的值

先看一下just是怎样创建被观察者对象的

Observable: 
    public static <T> Observable<T> just(final T value) {
        return ScalarSynchronousObservable.create(value);
    }

ScalarSynchronousObservable:
public final class ScalarSynchronousObservable<T> extends Observable<T> {
    public static <T> ScalarSynchronousObservable<T> create(T t) {
        return new ScalarSynchronousObservable<T>(t);
    }

    protected ScalarSynchronousObservable(final T t) {
        //会创建一个OnSubscribe,OnSubscribe来通知观察者不同行为
        super(new OnSubscribe<T>() {

            @Override
            public void call(Subscriber<? super T> s) {
                s.setProducer(createProducer(s, t));
            }
        });
        this.t = t;
    }
}

下面重点看一下map是怎样转换的

    public final <R> Observable<R> map(Func1<? super T, ? extends R> func) {
        // 传入一个OperatorMap对象,lift主要做事件序列的处理和再发送 
        return lift(new OperatorMap<T, R>(func));
    }

OperatorMap

public final class OperatorMap<T, R> implements Operator<R, T> {

    final Func1<? super T, ? extends R> transformer;

    public OperatorMap(Func1<? super T, ? extends R> transformer) {
        this.transformer = transformer;
    }

    @Override
    public Subscriber<? super T> call(final Subscriber<? super R> o) {
        return new Subscriber<T>(o) {

            @Override
            public void onCompleted() {
                o.onCompleted();
            }

            @Override
            public void onError(Throwable e) {
                o.onError(e);
            }

            @Override
            public void onNext(T t) {
                try {
                    //transformer是map中传入的Func1
                    o.onNext(transformer.call(t));
                } catch (Throwable e) {
                    Exceptions.throwOrReport(e, this, t);
                }
            }
        };
    }
}

OperatorMap中会创建一个新的观察者并在onNext中做类型的转换,但是创建了新的观察者并没有看到订阅操作,那么定位操作在哪做的呢?

    public final <R> Observable<R> lift(final Operator<? extends R, ? super T> operator) {
        // 创建一个新的被观察者
        return new Observable<R>(new OnSubscribe<R>() {
            @Override
            public void call(Subscriber<? super R> o) {
                try {
                    Subscriber<? super T> st = hook.onLift(operator).call(o);
                    try {
                        // 调用operator创建的观察者的onStart
                        st.onStart();
                        //调用原始被观察者onSubscribe的call,但传入的Subscriber是operator中call方法创建的,里面会调用func1做类型转换
                        onSubscribe.call(st);
                    } catch (Throwable e) {
           
                    }
                } catch (Throwable e) {
                    Exceptions.throwIfFatal(e);
                }
            }
        });
    }

1、flatMap

    private Subscription processNetAddress() {
        return Observable.just(
                "http://www.baidu.com/",
                "https://www.sina.com/",
                "https://www.sohu.com/")
                .flatMap(new Func1<String, Observable<String>>() {
                    @Override
                    public Observable<String> call(String s) {
                        return createObservable(s);
                    }
                })
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                    }
                });
    }

    private Observable<String> createObservable(String s) {
        return null;
    }

将传入的事件对象转换成一个Observable对象;
他是不会直接发送这个Observable,而是将这个Observable激活让他自己开始发送事件;
每一个创建出来的Observable发送事件,都会被传入同一个Observable

八、线程控制

在默认不指定线程的情况下,Rxjava遵循线程不变原则:在哪个线程调用的subscribe就在哪个线程生产事件、消费事件

Rxjava通过Schedulers通过线程调度:

  • Schedulers.immediate():当前线程执行,不切换线程
  • Schedulers.newThread():总是启用新线程
  • Schedulers.io():io线程,内部是一个没有数量上限的线程池
  • Schedulers.computation(): 计算线程
  • AndroidSchedulers.mainThread():主线程

1、subscribeOn()

OnSubscribe中call方法执行所处的线程

    // 创建一个新的被观察者,通过新的观察者来做操作 
    public final Observable<T> subscribeOn(Scheduler scheduler) {
        if (this instanceof ScalarSynchronousObservable) {
            return ((ScalarSynchronousObservable<T>)this).scalarScheduleOn(scheduler);
        }
        return create(new OperatorSubscribeOn<T>(this, scheduler));
    }
public final class OperatorSubscribeOn<T> implements OnSubscribe<T> {

    final Scheduler scheduler;
    final Observable<T> source;

    public OperatorSubscribeOn(Observable<T> source, Scheduler scheduler) {
        this.scheduler = scheduler;
        this.source = source;
    }

    @Override
    public void call(final Subscriber<? super T> subscriber) {
        final Worker inner = scheduler.createWorker();
        subscriber.add(inner);
        //根据不同的scheduler做不同的线程处理
        inner.schedule(new Action0() {
            @Override
            public void call() {
                final Thread t = Thread.currentThread();
                
                Subscriber<T> s = new Subscriber<T>(subscriber) {
                    @Override
                    public void onNext(T t) {
                        subscriber.onNext(t);
                    }
                    
                    @Override
                    public void onError(Throwable e) {
                        try {
                            subscriber.onError(e);
                        } finally {
                            inner.unsubscribe();
                        }
                    }
                    
                    @Override
                    public void onCompleted() {
                        try {
                            subscriber.onCompleted();
                        } finally {
                            inner.unsubscribe();
                        }
                    }
                    
                    @Override
                    public void setProducer(final Producer p) {
                        subscriber.setProducer(new Producer() {
                            @Override
                            public void request(final long n) {
                                if (t == Thread.currentThread()) {
                                    p.request(n);
                                } else {
                                    inner.schedule(new Action0() {
                                        @Override
                                        public void call() {
                                            p.request(n);
                                        }
                                    });
                                }
                            }
                        });
                    }
                };
                // 在新的线程中调用原始OnSubscribe的call方法
                source.unsafeSubscribe(s);
            }
        });
    }
} 
    public final Subscription unsafeSubscribe(Subscriber<? super T> subscriber) {
        try {
           
            subscriber.onStart();
            //调用原始OnSubscribe的call方法
            hook.onSubscribeStart(this, onSubscribe).call(subscriber);
            return hook.onSubscribeReturn(subscriber);
        } catch (Throwable e) {
            
            return Subscriptions.unsubscribed();
        }
    }

  1. 生成一个新的Observable、OnSubscribe
  2. 新的OnSubscribe会在目标Subscriber订阅时使用传入的Scheduler的worker作为线程调度执行者

2、observeOn()

事件消费 的线程
通过operator操作符的形式去完成线程的切换

    public final Observable<T> observeOn(Scheduler scheduler, boolean delayError, int bufferSize) {
        if (this instanceof ScalarSynchronousObservable) {
            return ((ScalarSynchronousObservable<T>)this).scalarScheduleOn(scheduler);
        }
        return lift(new OperatorObserveOn<T>(scheduler, delayError, bufferSize));
    }
public final class OperatorObserveOn<T> implements Operator<T, T> {
    @Override
    public Subscriber<? super T> call(Subscriber<? super T> child) {
        if (scheduler instanceof ImmediateScheduler) {
            // avoid overhead, execute directly
            return child;
        } else if (scheduler instanceof TrampolineScheduler) {
            // avoid overhead, execute directly
            return child;
        } else {
            ObserveOnSubscriber<T> parent = new ObserveOnSubscriber<T>(scheduler, child, delayError, bufferSize);
            parent.init();
            return parent;
        }
    }
    private static final class ObserveOnSubscriber<T> extends Subscriber<T> implements Action0 {
        @Override
        public void onNext(final T t) {
            if (isUnsubscribed() || finished) {
                return;
            }
            if (!queue.offer(on.next(t))) {
                onError(new MissingBackpressureException());
                return;
            }
            //新线程中处理
            schedule();
        }

        @Override
        public void onCompleted() {
            if (isUnsubscribed() || finished) {
                return;
            }
            finished = true;
            schedule();
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容