RxJava 学习

来源:互联网 发布:艺考必备软件 编辑:程序博客网 时间:2024/05/22 00:18

参考地址https://yq.aliyun.com/articles/63660
http://gank.io/post/560e15be2dca930e00da1083

1.概念

rxJava:异步的框架. 类似于 AsyncTask. 但其灵活性和扩展性远远强于前者,扩展的观察者模式实现的,何为观察者模式:观察者模式是一种一对多的依赖关系,当一个对象改变状态时,它会通知所有依赖者接受通知,并决定数据是否改变。

2.原理

rxJava中涉及到4个概念:Observable (可观察者,即被观察者)、 Observer (观察者)、 subscribe (订阅)、事件。Observable 和Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer数据刷新。

与传统观察者模式不同, RxJava 的事件回调方法除了普通事件 onNext() (相当于 onClick() / onEvent())之外,还定义了两个特殊的事件:onCompleted() 和 onError()。
  • onCompleted(): 事件队列完结。RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的onNext() 发出时,需要触发 onCompleted() 方法作为标志。
  • onError(): 事件队列异常。在事件处理过程中出异常时,onError() 会被触发,同时队列自动终止,不允许再有事件发出。

    注意:在一个正确运行的事件序列中, onCompleted() 和 onError() 有且只有一个,也就是说onCompleted() 和 onError() 二者也是互斥的。在响应的队列中只能调用一个。

例子
ContentProvider是观察者,联系人Contacts是被观察者,在Activity中ContentProvider通过注册的方式订阅Contacts数据变化的事件,当Contact数据发生变化时,就主动通知注册过其事件的观察者。

观察者(DisposableObserver)与被观察者(sampleObservable)通过订阅(subscribeWith)的方式建立联系,sampleObservable在后台线程中运行,发生数据变化时通过主线程通知给观察者的onNext(),再进行UI刷新的操作

创建观察者

    Observer<String> observer = new Observer<String>() {        @Override        public void onSubscribe(Disposable d) {        }        @Override        public void onNext(String value) {            //value 可以时任意类型Observable返回的对象            Log.d("","value is from Observable");        }        @Override        public void onError(Throwable e) {        }        @Override        public void onComplete() {        }    };

Observer 的抽象类:Subscriber。 Subscriber 对 Observer 接口进行了一些扩展,但他们的基本使用方式是完全一样的:
在 RxJava 的 subscribe 过程中,Observer 也总是会先被转换成一个 Subscriber 再使用。所以如果只想使用基本功能,选择 Observer 和 Subscriber 是完全一样的。它们的区别对于使用者来说主要有两点:

  • 1.onStart(): 这是 Subscriber 增加的方法。它会在 subscribe 刚开始,而事件还未发送之前被调用,可以用于做一些准备工作,例如数据的清零或重置。这是一个可选方法,默认情况下它的实现为空。需要注意的是,如果对准备工作的线程有要求(例如弹出一个显示进度的对话框,这必须在主线程执行), onStart() 就不适用了,因为它总是在 subscribe 所发生的线程被调用,而不能指定线程。要在指定的线程来做准备工作,可以使用 doOnSubscribe() 方法,具体可以在后面的文中看到。

  • 2.unsubscribe(): 这是 Subscriber 所实现的另一个接口 Subscription 的方法,用于取消订阅。在这个方法被调用后,Subscriber 将不再接收事件。一般在这个方法调用前,可以使用 isUnsubscribed() 先判断一下状态。 unsubscribe() 这个方法很重要,因为在 subscribe() 之后, Observable 会持有 Subscriber 的引用,这个引用如果不能及时被释放,将有内存泄露的风险。所以最好保持一个原则:要在不再使用的时候尽快在合适的地方(例如 onPause() onStop() 等方法中)调用 unsubscribe() 来解除引用关系,以避免内存泄露的发生。

创建被观察者Observable

/*通过create()创建被观察者*/    Observable observableCreater = Observable.create(new ObservableOnSubscribe<String>() {        @Override        public void subscribe(ObservableEmitter emitter) throws Exception {            emitter.onNext("I am result that will send to Observer");        }    });/*创建from类型函数的Observable*/    Observable observableFrom = Observable.fromArray("I am from network or local");    Observable observableFrom1 = Observable.fromCallable(new Callable() {        @Override        public Object call() throws Exception {               return null;        }    });

from类型的创建根据需求不同还可以调用fromFuture/fromIterable/fromPublisher等分别对应不同的观察者
还有一种Observable.just(“one”, “two”, “three”, “four”, “five”);最终调用的也是Observable.fromArray

subscribe订阅

值得注意的是其逻辑:被观察者订阅了观察者
实现方式

observableCreater.subscribe(observer);        observableCreater.subscribe(new Consumer() {            @Override            public void accept(Object o) throws Exception {            }        });

以上我们看到 对于observable是可以订阅它自己的临时消费者,且这个消费者可以通过自己的方法收到Observable的数据

流程图:

这里写图片描述

Schedulers 线程调控器

在不指定线程的情况下, RxJava 遵循的是线程不变的原则,即:在哪个线程调用 subscribe(),就在哪个线程生产事件;在哪个线程生产事件,就在哪个线程消费事件。如果需要切换线程,就需要用到 Scheduler (线程调度器)。

observableCreater.subscribeOn(Schedulers.io())                .observeOn(AndroidSchedulers.mainThread())                .subscribe(observer);

利用 Schedulers 实现后台进行数据处理,前台显示数据,提高效率

  • Schedulers.io() 处理输入/输出类型的工作,比如读存数据库,网络请求,读写本地数据等
    -Schedulers.trampoline(),在当前工作完成后就在当前线程执行队列中的工作
    -Schedulers.newThread(),每次都创建新的线程完成单位工作
    -Schedulers.single(),从2.0开始有了这个选择,返回普通的单一的线程,支持延时处理的工作和主线程传数据给其他线程,但是要避免大量数据的循环处理
    -Schedulers.from(Executor executor) ,把 Executor 封装成 Schedulers 返回
    -Schedulers.computation(),这样的线程可以执行事件的轮询处理,回掉过程,还有其他计算型工作,不适合处理大量IO型处理。

未完待续~!

原创粉丝点击