1、RxJava 的观察者模式
RxJava 有四个基本概念:Observable (可观察者,即被观察者)、 Observer (观察者)、 subscribe (订阅)、事件。Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer。
2、 创建 Observable
Observable 即被观察者,它决定什么时候触发事件以及触发怎样的事件。 RxJava 使用 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();
}
});
- just(T…): 将传入的参数依次发送出来。
- from(T[]) / from(Iterable<? extends T>) : 将传入的数组或 Iterable
拆分成具体对象后,依次发送出来。
3、subscribe订阅
observable.subscribe(observer);
// 或者:
observable.subscribe(subscriber);
4、线程控制
- Schedulers.newThread(): 总是启用新线程,并在新线程执行操作
- Scheduleres.io():I/O操作
- Scheduleres.mainThread():它指定操作将在Adroid主线程运行
subscribeOn(): 指定 subscribe() 所发生的线程即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程。
observeOn(): 指定 Subscriber 所运行在的线程。或者叫做事件消费的线程。
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);
}
});
由于 subscribeOn(Schedulers.io()) 的指定,被创建的事件的内容 1、2、3、4 将会在 IO 线程发出;而由于 observeOn(AndroidScheculers.mainThread()) 的指定,因此 subscriber 数字的打印将发生在主线程 。
5、变换对象
- map():事件对象的直接变换,一对一
- flatMap():一对多
Student[] students = ...;
Subscriber<Course> subscriber = new Subscriber<Course>() {
@Override
public void onNext(Course course) {
Log.d(tag, course.getName());
}
...
};
Observable.from(students)
.flatMap(new Func1<Student, Observable<Course>>() {
@Override
public Observable<Course> call(Student student) {
return Observable.from(student.getCourses());
}
})
.subscribe(subscriber);
6、组合/合并操作符
1)作用:组合 多个被观察者(Observable) & 合并需要发送的事件
- concat()/concatArray() 组合多个被观察者一起发送数据,合并后 按发送顺序串行执行
- merge()/mergeArray() 组合多个被观察者一起发送数据,合并后 按时间线并行执行
- zip() 该类型的操作符主要是对多个被观察者中的事件进行合并处理。