RxJava学习笔记

转载 2017年01月24日 02:49:04

1.概念:扩展的观察者模式
RxJava的异步实现,是通过一种扩展的观察者模式来实现的。
观察者模式:
A 对象(观察者)对 B 对象(被观察者)的某种变化高度敏感,需要在 B 变化的一瞬间做出反应。观察者不需要时刻盯着被观察者(例如 A 不需要每过 2ms 就检查一次 B 的状态),而是采用注册(Register)或者称为订阅(Subscribe)的方式,告诉被观察者:我需要你的某某状态,你要在它变化的时候通知我。这里写图片描述RxJava作为一个工具库,使用的就是通用形式的观察者模式。
RxJava的观察者模式:
RxJava有四个基本概念: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() 二者也是互斥的,即在队列中调用了其中一个,就不应该再调用另一个。
2.基本实现
1)创建Observer
Observer即观察者,它决定事件触发的时候将有怎样的行为。RxJava中的Observer接口的实现方式:

Observer<String> observer = new Observer<String>() {
    @Override
    public void onNext(String s) {
        Log.d(tag, "Item: " + s);
    }

    @Override
    public void onCompleted() {
        Log.d(tag, "Completed!");
    }

    @Override
    public void onError(Throwable e) {
        Log.d(tag, "Error!");
    }
};
除了 Observer 接口之外,RxJava 还内置了一个实现了 Observer 的抽象类:Subscriber。 Subscriber 对 Observer 接口进行了一些扩展,但他们的基本使用方式是完全一样的:

Subscriber subscriber = new Subscriber() {
@Override
public void onNext(String s) {
Log.d(tag, “Item: ” + s);
}

@Override
public void onCompleted() {
    Log.d(tag, "Completed!");
}

@Override
public void onError(Throwable e) {
    Log.d(tag, "Error!");
}

};

    实质上,在 RxJava 的 subscribe 过程中,Observer 也总是会先被转换成一个 Subscriber 再使用。所以如果你只想使用基本功能,选择 Observer 和 Subscriber 是完全一样的。它们的区别对于使用者来说主要有两点:
    1.onStart(): 这是 Subscriber 增加的方法。它会在 subscribe 刚开始,而事件还未发送之前被调用,可以用于做一些准备工作,例如数据的清零或重置。这是一个可选方法,默认情况下它的实现为空。需要注意的是,如果对准备工作的线程有要求(例如弹出一个显示进度的对话框,这必须在主线程执行), onStart() 就不适用了,因为它总是在 subscribe 所发生的线程被调用,而不能指定线程。要在指定的线程来做准备工作,可以使用 doOnSubscribe() 方法,具体可以在后面的文中看到。
    2.unsubscribe(): 这是 Subscriber 所实现的另一个接口 Subscription 的方法,用于取消订阅。在这个方法被调用后,Subscriber 将不再接收事件。一般在这个方法调用前,可以使用 isUnsubscribed() 先判断一下状态。要在不再使用的时候尽快在合适的地方(例如 onPause() onStop() 等方法中)调用 unsubscribe() 来解除引用关系,以**避免内存泄露**的发生。
2) 创建 Observable
Observable 即被观察者,它决定什么时候触发事件以及触发怎样的事件。 RxJava 使用 create() 方法来创建一个 Observable ,并为它定义事件触发规则:

Observable observable = Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber

3)快捷创建事件序列的方法
~just(T...):将传入的参数一次发送出去

Observable observable = Observable.just("Hello", "Hi", "Aloha");

~from(T[]) / from(Iterable<? extends T>) : 将传入的数组或 Iterable 拆分成具体对象后,依次发送出来。

4)Subscribe (订阅)

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

这里写图片描述
5.应用举例
a.打印字符串数组

String[] names = ...;
Observable.from(names)
    .subscribe(new Action1<String>() {
        @Override
        public void call(String name) {
            Log.d(tag, name);
        }
    });

b.由id取得图片并显示

int drawableRes = ...;
ImageView imageView = ...;
Observable.create(new OnSubscribe<Drawable>() {
    @Override
    public void call(Subscriber<? super Drawable> subscriber) {
        Drawable drawable = getTheme().getDrawable(drawableRes));
        subscriber.onNext(drawable);
        subscriber.onCompleted();
    }
}).subscribe(new Observer<Drawable>() {
    @Override
    public void onNext(Drawable drawable) {
        imageView.setImageDrawable(drawable);
    }

    @Override
    public void onCompleted() {
    }

    @Override
    public void onError(Throwable e) {
        Toast.makeText(activity, "Error!", Toast.LENGTH_SHORT).show();
    }
});

RxJava 的默认规则中,事件的发出和消费都是在同一个线程的。
6.线程控制-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() 和 observeOn() 两个方法来对线程进行控制了。前者称作产生的线程后者称作消费线程。

Observable.just(1, 2, 3, 4)
    .subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程
    .observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程
    .subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer number) {
            Log.d(tag, "number:" + number);
        }
    });

7.RxJava的变换:所谓变换,就是将事件序列中的对象或整个序列进行加工处理,转换成不同的事件或事件序列。

Observable.just("images/logo.png") // 输入类型 String
    .map(new Func1<String, Bitmap>() {
        @Override
        public Bitmap call(String filePath) { // 参数类型 String
            return getBitmapFromPath(filePath); // 返回类型 Bitmap
        }
    })
    .subscribe(new Action1<Bitmap>() {
        @Override
        public void call(Bitmap bitmap) { // 参数类型 Bitmap
            showBitmap(bitmap);
        }
    });

FuncX 和 ActionX 的区别在 FuncX 包装的是有返回值的方法。
常用的变换:
~map(): 事件对象的直接变换,具体功能上面已经介绍过。它是 RxJava 最常用的变换。
~flatMap(): 这是一个很有用但非常难理解的变换,因此我决定花多些篇幅来介绍它。 首先假设这么一种需求:假设有一个数据结构『学生』,现在需要打印出一组学生的名字。
变换的实质:是针对事件序列的处理和再发送。
详情:http://gank.io/post/560e15be2dca930e00da1083#toc_1

相关文章推荐

RxJava学习笔记(一)--- 基础篇

最近项目中有用到RxJava来进行响应式编程,目前对这部分内容还比较陌生,于是决定开始一波RxJava相关内容的学习,想尽快掌握这门技术。在网上还是有很多相关的资源,我的博客仅作为相关内容的搬运工,希...
  • siguoyi
  • siguoyi
  • 2016年06月30日 15:44
  • 559

RxJava学习笔记---简单使用

RxJava是什么 Rx是什么 Rx全称Reactive Extensions,译为响应式拓展。 微软最先提出这个概念,借用MSDN上的定义:Reactive Extensions(Rx)是...

rxJava学习笔记

什么是RxJava 官网是这么说的:“RxJava – Reactive Extensions for the JVM – a library for composing asynchronou...

RxJava的学习笔记

RxJava的学习笔记 RxJava 在 GitHub 主页上的自我介绍是 “a library for composing asynchronous and event-based program...

Rx系列学习笔记_RxJava+Retrofit进行简单请求

之前简单的学习了一下Rxjava的一些方法,现在来通过请求数据来继续学习。1 .请求的APIpublic interface MyApi { /** * 获取列表信息 * @...

RXJava学习笔记(1)

说明 RXJava最近火的不行,各种衍生品已经越来越多的充斥我们的眼球。简单来说,RXJava就是被观察者(Observable)和观察者(Observer)中间通过一种订阅关系(subscrib...

RxJava学习笔记

概念理解 一种观察者模式,封装了极方便的线程操作,可以用于嵌套回调机制使代码更加清晰。 定义 Observer:观察者,设置被观察者有什么行为时调用RxJava接口的实现方法。o...

RxJava学习笔记

RxJava学习笔记从以下几个问题来认识RxJava什么是RxJava异步,一个在java vm上使用可观察的序列来组成的异步,基于事件的程序库。RxJava有什么好?简洁。逻辑性强。RxJava的设...

RxJava学习笔记4

这里我们再来深入学习一下RxJava的线程调度,在RxJava学习笔记2中简单对RxJava中的线程调度进行了简单的使用介绍,这里我么继续深入线程调度在RxJava中的提现可以利用 subscribe...

RxJava学习笔记

RxJava学习笔记什么是RxJava—实现异步操作的库一个在Java VM上使用可观测的序列来组成异步的、基于事件的程序的库优点简洁,随着程序逻辑变得越来越复杂,它依然能够保持简洁原理简析RxJav...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RxJava学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)