Android源码分析之基础版RxJava框架

1 基础版RxJava框架

  RxJava是一个非常牛逼的框架,用法很简单,但内部实现复杂,代码逻辑绕。既然用拆轮子的方式来分析源码比较难啃,我们换种方式,以造轮子的方式,将源码中与性能、兼容性、扩展性有关的代码剔除,留下核心代码带大家揭秘RxJava的实现原理。
  RxJava是响应式编程–Reactive Programming在Java中的一种实现。那啥叫响应呢?你烧水呢,水烧开了,水壶会叫,这就是一下响应了。
  响应式它是依赖于事件的,响应式的代码它的运行不是按代码的顺序,而是跟多个按时间发生的事件有关。依赖事件就是“回调”,但在响应式编程里,这些按时间排列的事件,被称为“流–stream”,它里面包含的是事件的时间值,这些时间值就是数据。
  可以说,响应式编程就是:异步的数据流的开发。

2 使用方法

(1)在 gradle 中引入:

compile 'com.guan.codelibs:rxjava:1.0.0'

(2)example

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 基本的RxJava例子
        textRxJava1();
        // map操作符的作用是将T类型的Event转化成R类型
        textRxJava2();
        // 线程切换
        textRxJava3();
    }

    /**
     * 基本的RxJava例子
     */
    public void textRxJava1() {
        Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                for (int i = 0; i < 10; i++) {
                    subscriber.onNext(i);
                }
            }
        }).subscribe(new Subscriber<Integer>() {
            @Override
            public void onCompleted() {

            }
            @Override
            public void onError(Throwable t) {

            }
            @Override
            public void onNext(Integer var1) {
                System.out.println(var1);
            }
        });
    }

    /**
     * map操作符的作用是将T类型的Event转化成R类型
     */
    private void textRxJava2() {
        Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                Log.e("tag", "create + call:" + 111);
                subscriber.onNext(111);
            }
        }).map(new Func1<Integer, String>() {
            @Override
            public String call(Integer from) {
                Log.e("tag", "create + Func1:" + from);
                return "maping " + from;
            }
        }).subscribe(new Subscriber<String>() {
            @Override
            public void onCompleted() {
                Log.e("tag", "onCompleted");
            }

            @Override
            public void onError(Throwable t) {
                Log.e("tag", "onError:" + t.toString());
            }

            @Override
            public void onNext(String var1) {
                Log.e("tag", "onNext:" + var1);
            }
        });
    }

    /**
     * 线程切换
     * subscribeOn()作用的是OnSubscribe
     * observeOn()作用的是Subscriber
     */
    private void textRxJava3() {
        Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                Log.e("tag", "OnSubscribe3call@ " + Thread.currentThread().getName());
                subscriber.onNext(1);
            }
        }).map(new Func1<Integer, String>() {
            @Override
            public String call(Integer from) {
                Log.e("tag", "OnSubscribe3Func1@ " + Thread.currentThread().getName());
                return "1";
            }
        })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {

                    }
                    @Override
                    public void onError(Throwable t) {

                    }
                    @Override
                    public void onNext(String var1) {
                        Log.e("tag", "Subscriber3onNext@ " + Thread.currentThread().getName());
                    }
                });
    }
}

这里写图片描述
(3)RxJava实现异步(子线程)

public interface RxAsyncCallback<T> {
    T doInBackgroud();
    void onPost(T t);
}

/**
 * 提醒:耗时操作放在子线程实行
 */
public class RxAsync {
    public static <T> void run(final RxAsyncCallback<T> callback) {
        Observable.create(new Observable.OnSubscribe<T>() {
            @Override
            public void call(Subscriber<? super T> subscriber) {
                T t = callback.doInBackgroud();
                subscriber.onNext(t);
                subscriber.onCompleted();
            }
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Observer<T>() {
            @Override
            public void onCompleted() {

            }
            @Override
            public void onError(Throwable e) {

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

3 源码地址

github项目地址:CodeLibs/lib-rxjava/

4 故事分析

    杀猪佬刀坏了-->找到他的朋友通知-->打铁佬打了一把刀(钱:杀猪佬-->他的朋友-->打铁佬)
    // Observable(订阅源)      --> 杀猪佬
    // create                    --> 找到
    // Observable.OnSubscribe<>  --> 他的朋友
    // Integer                   --> 钱(给了朋友钱)
    // subscribe                 --> 通知(onSubscribe.call(subscriber))
    // Subscriber(观察者)       --> 打铁佬
    // onNext(Ivar1)             --> 打了一把刀(朋友把钱转给打铁佬)
    Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                subscriber.onNext(i);
            }
        }).subscribe(new Subscriber<Integer>() {
            @Override
            public void onCompleted() {

            }
            @Override
            public void onError(Throwable t) {

            }
            @Override
            public void onNext(Integer var1) {
                System.out.println(var1);
            }
        });


    杀猪佬刀坏了,但是它只有猪肉没钱-->找一个中介把猪肉换成钱-->找到他的朋友通知-->打铁佬打了一把刀
    (猪肉:杀猪佬-->中介 = 钱;钱:杀猪佬-->他的朋友-->打铁佬)
    // Observable(订阅源)         --> 杀猪佬
    // create                       --> 找到
    // Observable.OnSubscribe<>     --> 他的朋友
    // Integer                      --> 猪肉
    // String                       --> 钱
    // map                          --> 找一个
    // new Func1<Integer, String>   --> 中介,把猪肉换成钱
    // subscribe                    --> 通知(onSubscribe.call(subscriber))
    // Subscriber(观察者)          --> 打铁佬
    // onNext(Ivar1)                --> 打了一把刀(朋友把钱转给打铁佬)
    Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                subscriber.onNext(1);
            }
        }).map(new Func1<Integer, String>() {
            @Override
            public String call(Integer from) {
                return "maping " + from;
            }
        }).subscribe(new Subscriber<String>() {
            @Override
            public void onCompleted() {

            }
            @Override
            public void onError(Throwable t) {

            }
            @Override
            public void onNext(String var1) {
                Log.e("tag","onNext:" + var1);
            }
        });

5 UML图分析

5.1 基本的RxJava例子

这里写图片描述
由于篇幅较大,请需要的小伙伴下载文件:RxJava框架时序图-基本的RxJava例子

5.2 map操作符:将T类型的Event转化成R类型

这里写图片描述
由于篇幅较大,请需要的小伙伴下载文件:RxJava框架时序图-map操作符

5.3 线程切换

这里写图片描述
由于篇幅较大,请需要的小伙伴下载文件:RxJava框架时序图-线程切换

6 学习链接

一起来造一个RxJava,揭秘RxJava的实现原理

ReactiveX/RxJava文档中文版

ReactiveX/RxJava-wiki

给 Android 开发者的 RxJava 详解

猜你喜欢

转载自blog.csdn.net/chenliguan/article/details/78966845