RxJava

来源:互联网 发布:什么软件看美剧最全 编辑:程序博客网 时间:2024/06/07 04:52

RxJava剥析

着手写RxJava2简析,也是我希望有更多人有对他更全面的了解,而不是先看到代码,一脸茫然,觉得不知如何用起,最重要的,还是自己以什么心态去学习这陌生又熟悉的RxJava,是随波逐流还是寻求自我,学什么都无非如此。好了,长话短说,入正:

Question 1:是什么;

两个字:异步。

Question 2:工作原理;

要使用,得先要了解RxJava特点:
首次看到它的时候,感觉这代码风格和我们平时命令式编码很大不同,它是以流程为核心,所执行的代码都是机器实际上要执行的指令,而这种风格,是称为函数式响应编程:以数据流为核心,处理数据输入输出的编程方式。

Question 3:为什么要用RxJava;

RxJava强大的地方在于:
1:代码分级处理,增加可读性和可再读性;
2:更加清晰的业务分离方式;代码更加简洁明了;
3:和AsyncTask和Handler相比,它的优势同样是简洁,而简洁的方式不同:随着逻辑变得更加复杂,却还是能够保持它的简洁性,这主要归功于它的分级。

明白了以上三个问题之后,是时候去学习它了,因为Rxjava1为实践版本,故直接讲述RxJava2:

RxJava核心原理:

基于观察者模式实现事件(任何事件)处理;
RxJava 有四个基本概念Observable (被观察者)、 Observer (观察者)、 subscribe (订阅(事件))。Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer。

实现方法

1):创建Observer

Observer 即观察者,它决定事件触发的时候将有怎样的行为:

    Observer<String> observer = new Observer<String>() {        @Override        public void onSubscribe(Disposable d) {            //当观察者被订阅(订阅)OnSubscribe接口的呼叫方法会被执行。            Log.e("gsw", "--observer-->onSubscribe: " + d);        }        @Override        public void onNext(String s) {            //下一步将要操作的事件            Log.e("gsw", "--observer-->onNext: " + s);        }        @Override        public void onError(Throwable e) {            //错误发生时产生的回调            Log.e("gsw", "--observer-->onError: " + e);        }        @Override        public void onComplete() {            //事件完成时的回调            Log.e("gsw", "--observer-->onComplete: ");        }    };

这时要着重讲一下OnSubscriber执行概要
/* 通常可以在这里做一些初始化操作,调用request()方法表示初始化工作已经完成,并立即触发onNext()方法
在onComplete()方法完成,才会再执行request()后边的代码
在2.X中,在我们onSubscribe()回调中必须调用s.request()方法去请求资源,参数就是要请求的数量,一般如果不限制请求数量,可以写成Long.MAX_VALUE,会之后触发|立即onNext()方法!
所以当你在onSubscribe()/onStart()中做了一些初始化的工作,而工作这些的英文在request()后面时,会出现一些问题,在onNext()执行时,你的初始化工作的那部分代码还没有执行。为了避免这种情况,请你确保调用request()时,已经把所有初始化工作做完了。*/

除了 Observer 接口之外,RxJava 还内置了一个实现了 Observer 的抽象类:Subscriber。 Subscriber 对 Observer 接口进行了一些扩展,但他们的基本使用方式是完全一样的:

不仅基本使用方式一样,实质上,在 RxJava 的 subscribe 过程中,Observer 也总是会先被转换成一个 Subscriber 再使用。所以如果你只想使用基本功能,选择 Observer 和 Subscriber 是完全一样的。

 Subscriber<Integer> subscriber = new Subscriber<Integer>() {        @Override        public void onSubscribe(Subscription s) {        //这一步是必须,我们通常可以在这里做一些初始化操作,调用request()方法表示初始化工作已经完成        //调用request()方法,会立即触发onNext()方法        //在onComplete()方法完成,才会再执行request()后边的代码            s.request(Long.MAX_VALUE);            Log.e("gsw", "subscriber-->onSubscribe-->Subscription: " + s);        }        @Override        public void onNext(Integer integer) {            Log.e("gsw", "subscriber-->onNext-->Integer: " + integer);        }        @Override        public void onError(Throwable t) {            Log.e("gsw", "subscriber-->onError-->ThrowableL:" + t);        }        @Override        public void onComplete() {            Log.e("gsw", "subscriber-->onComplete--");        }    };

2) 创建 Observable

Observable 即被观察者,它决定什么时候触发事件以及触发怎样的事件。 RxJava 使用 create() 方法来创建一个 Observable ,并为它定义事件触发规则:
      Observable observable = Observable.create(new ObservableOnSubscribe() {        @Override        public void subscribe(ObservableEmitter e) throws Exception {            subscriber.onNext(0);            subscriber.onNext(1);            subscriber.onNext(2);            observer.onNext("gsw-->01");            observer.onNext("gsw-->02");            observer.onNext("gsw-->03");            observer.onComplete();            subscriber.onComplete();        }    });
create() 方法是 RxJava 最基本的创造事件序列的方法。基于这个方法, RxJava 还提供了一些方法用来快捷创建事件队列,例如:
//just(T...): 将传入的参数依次发送出来。Observable observable = Observable.just("Hello", "Hi", "Aloha");
//from(T[]) / from(Iterable<? extends T>) : 将传入的数组或 Iterable 拆分成具体对象后,依次发送出来。String[] words = {"Hello", "Hi", "Aloha"};Observable observable = Observable.from(words);

3) Subscribe (订阅):

创建了 Observable 和 Observer 之后,再用 subscribe() 方法将它们联结起来,就可以工作了。
        //订阅其一        observable.subscribe(observer);        //订阅全部        observable.subscribe();

关键理解点:

有人可能会注意到, subscribe() 这个方法有点怪:它看起来是『observalbe 订阅了 observer / subscriber』而不是『observer / subscriber 订阅了 observalbe』,这看起来就像『杂志订阅了读者』一样颠倒了对象关系。这让人读起来有点别扭,不过如果把 API 设计成 observer.subscribe(observable) / subscriber.subscribe(observable) ,虽然更加符合思维逻辑,但对流式 API 的设计就造成影响了,比较起来明显是得不偿失的。
原创粉丝点击