系列文章
RxJava系列之简介和观察者设计模式
RxJava系列之上游与下游
RxJava系列之常用创建型操作符
RxJava系列之常用变换操作符
RxJava系列之常用过滤操作符
RxJava系列之常用条件操作符
RxJava系列之常用合并操作符
RxJava系列之常用异常操作符
RxJava系列之线程切换实战
RxJava系列之背压模式
RxJava系列之配合Retrofit
RxJava系列之泛型高级
RxJava系列之手写create操作符
RxJava系列之手写create操作符增加泛型限定
RxJava系列之手写just操作符
RxJava系列之手写map操作符
RxJava系列之手写切换线程
RxJava简介
响应式编程
在介绍RxJava前,我们先聊聊响应式编程。那么什么是响应式编程呢?响应式编程是一种基于异步数据流概念的编程模式。数据流就像一条河:它可以被观测,被过滤,被操作,或者为新的消费者与另外一条流合并为一条新的流。
响应式编程的一个关键概念是事件。事件可以被等待,可以触发过程,也可以触发其它事件。事件是唯一的以合适的方式将我们的现实世界映射到我们的软件中:如果屋里太热了我们就打开一扇窗户。同样的,当我们的天气app从服务端获取到新的天气数据后,我们需要更新app上展示天气信息的UI;汽车上的车道偏移系统探测到车辆偏移了正常路线就会提醒驾驶者纠正,就是是响应事件。
今天,响应式编程最通用的一个场景是UI:我们的移动App必须做出对网络调用、用户触摸输入和系统弹框的响应。在这个世界上,软件之所以是事件驱动并响应的是因为现实生活也是如此。概念摘自《RxJava Essentials》一书。
RxJava的来历
Rx是微软.Net的一个响应式扩展,Rx借助可观测的序列提供一种简单的方式来创建异步的,基于事件驱动的程序。2012年Netflix为了应对不断增长的业务需求开始将.NET Rx迁移到JVM上面。并于13年二月份正式向外展示了RxJava。
从语义的角度来看,RxJava就是.NET Rx。从语法的角度来看,Netflix考虑到了对应每个Rx方法,保留了Java代码规范和基本的模式。
什么是RxJava
一个异步操作的框架。
观察者设计模式
被观察者中持有观察者对象,一旦被观察者发生变化,可以立刻通知观察者。
被观察者标准接口
// 被观察者标准
public interface Observable {
/**
* 在被观察者中 注册 观察者
*/
void registerObserver(Observer observer);
/**
* 在被观察者中 移除 观察者
*/
void removeObserver(Observer observer);
/**
* 在被观察者中 通知 所有注册的 观察者
*/
void notifyObservers();
}
观察者标准接口
// 观察者标准
public interface Observer {
/**
* 收到 被观察者 发生改变
* @param observableInfo
* @param <T>
*/
<T> void changeAction(T observableInfo);
}
被观察者实现类
/**
* 被观察者 实现类
*/
public class ObservableImpl implements Observable {
private List<Observer> observerList = new ArrayList<>(); // 观察者容器 5
@Override
public void registerObserver(Observer observer) {
observerList.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observerList.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observerList) {
// 在被观察者实现类中,通知所有注册好的观察者
observer.changeAction("被观察者 发生了改变...");
}
}
}
观察者实现类
public class ObserverImpl implements Observer {
@Override
public <T> void changeAction(T observableInfo) {
System.out.println(observableInfo);
}
}
测试代码
public class TestClient {
public static void main(String[] args) {
Observer observer_1 = new ObserverImpl(); // 读者1 - 观察者
Observer observer_2 = new ObserverImpl(); // 读者2 - 观察者
Observer observer_3 = new ObserverImpl(); // 读者3 - 观察者
Observer observer_4 = new ObserverImpl(); // 读者4 - 观察者
Observer observer_5 = new ObserverImpl(); // 读者5 - 观察者
// 作家 被观察者
Observable observable = new ObservableImpl();
// 关联 注册 读者订阅作家
observable.registerObserver(observer_1);
observable.registerObserver(observer_2);
observable.registerObserver(observer_3);
observable.registerObserver(observer_4);
observable.registerObserver(observer_5);
// 作家发布作品 被观察者发生改变
observable.notifyObservers();
}
}
典型的观察者设计模式中,一个被观察者对应多个观察者。但是RxJava中,一个被观察者对应一个观察者,还是有些不一样的。例如下面的代码
// 起点 被观察者
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
}
})
.subscribe( // 订阅 == registerObserver
// 终点 一个 观察者
new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});