RxJava笔记

来源:互联网 发布:淘宝卖家登陆页面 编辑:程序博客网 时间:2024/05/21 19:48

RxJava 观察者模式

四个基本概念:

Observable : 被观察者
Observer : 观察者
subscribe : 订阅
事件
订阅关系:
Observable <—-subscribe—-> Observer,Observable发出时间通知Observer。

三个事件:

· onCompleted():RxJava将事件放进队列,当没有新的onNext()事件时会触发onCompleted();
· onError():事件队列出现异常时,onError()被触发,同时队列终止,不允许再有事件发出;
onCompleted和onError只有一个,在队列的最后一个调用。

实现步骤:

Ⅰ创建Observer

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

Observer接口:

Observer<String>observer = new Observer<String>(){    //@Override回掉方法    onNext(String){}    onCompleted(){}    onError(Throwable e){}}

实现Observer接口的抽象类Subscriber(进行了扩展):

Subseriber<String> sub = new Subseriber<String>(){    onNext(String){}    onCompleter(){}    onError(Throwable e){}}

实质上Oberver会被先转换成一个Subseriber再使用。
两者区别:
Subscriber新增的两个方法:
1.onStart():在事件还未发送前调用,做准备工作。不能对线程有要求,在subscirbe发生的线程调用,不能指定线程。(如果要指定线程可以用duOnSubscirbe()方法);
2.unsubscirbe():用于取消订阅。调用前可用isUnsubscribed() 判断状态。subscribe() 之后, Observable 会持有 Subscriber 的引用,不释放可能会内存泄漏;

Ⅱ创建Observable

Observable 即被观察者,它决定什么时候触发事件以及触发怎样的事件。
使用create()创建Observable:

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

Ⅲ订阅事件

创建了 Observable 和 Observer 之后,再用 subscribe() 方法将它们联结起来,整条链子就可以工作了。

observable.subscribe(observer);// 或者:observable.subscribe(subscriber);

涉及到的类:
1.OnSubscribe类

OnSubscribe{    //call方法    public void call(Subscriber<? super Object> subscriber){}}

2.Subscriber类

Subscriber{    onStart(){}    onNext(){}    onComplete(){}    onError(){}    unsubscribe(){}}

3.Observable类

Observable{    //订阅的方法:    subscribe(Subscriber sub){}}

关系:
Observable observable = Observable.create(OnSubscribe onSubscribe);
onSubscribe会被存在observable中;
当observable被订阅的时候,onSubscribe的call方法被调用:

observable.subscribe(subscriber);subscribe方法内部实现:public Subscription subscribe(Subscriber subscriber) {    subscriber.onStart();    onSubscribe.call(subscriber);    return subscriber;}

线程控制 Scheduler

  • Schedulers.immediate(): 直接在当前线程运行,相当于不指定线程。这是默认的 Scheduler。

  • Schedulers.newThread(): 总是启用新线程,并在新线程执行操作。

  • Schedulers.io(): I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。行为模式和 newThread() 差不多,区别在于 io() 的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。不要把计算工作放在 io() 中,可以避免创建不必要的线程。

  • Schedulers.computation(): 计算所使用的 Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU。

  • 另外, Android 还有一个专用的 AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。

切换线程的方法:

  • subscribeOn(): 指定 subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程。
  • observeOn(): 指定 Subscriber 所运行在的线程。或者叫做事件消费的线程。
    observeOn()可以多次调用切换不同的线程,subscribeOb()被多次调用时只进行在第一次调用的线程。

在流程执行前指定准备工作的线程的方法:doOnSubscribe
虽然超过一个的 subscribeOn() 对事件处理的流程没有影响,但在流程之前却是可以利用的。
Subscriber 的 onStart() 可以用作流程开始前的初始化。然而 onStart() 由于在 subscribe() 发生时就被调用了,因此不能指定线程,而是只能执行在 subscribe() 被调用时的线程。这就导致如果 onStart() 中含有对线程有要求的代码(例如在界面上显示一个 ProgressBar,这必须在主线程执行),将会有线程非法的风险,因为有时你无法预测 subscribe() 将会在什么线程执行。
而与 Subscriber.onStart() 相对应的,有一个方法 Observable.doOnSubscribe() 。它和 Subscriber.onStart() 同样是在 subscribe() 调用后而且在事件发送前执行,但区别在于它可以指定线程。默认情况下, doOnSubscribe() 执行在 subscribe() 发生的线程;而如果在 doOnSubscribe() 之后有 subscribeOn() 的话,它将执行在离它最近的 subscribeOn() 所指定的线程。

Observable.create(onSubscribe)    .subscribeOn(Schedulers.io())    .doOnSubscribe(new Action0() {        @Override        public void call() {            progressBar.setVisibility(View.VISIBLE); // 需要在主线程执行        }    })    .subscribeOn(AndroidSchedulers.mainThread()) // 指定主线程    .observeOn(AndroidSchedulers.mainThread())    .subscribe(subscriber);
0 0