什么是Observable
这里需要先说一下观察者模式,因为Observable从另一个角度讲,它担任了观察者模式中的一个角色。
对于观察者模式,维基百科官方解释是:
观察者模式是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。 — 维基百科
通常我们对于观察者模式的了解可能是这样,这个说法可能更加通俗易懂。
观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。
那我们知道了观察者模式是什么之后,下面开始说一说Observable。
在RxJava中,有四个基本概念:
- Observable (被观察者)
- Observer (观察者)
- Subscribe (订阅)
- 事件
Observable和Observer通过Subscribe()方法实现订阅,从而Observable可以在需要的时候发出事件来通知观察者Observer。
这里需要强调的是只有Observable订阅了Observer,Observable才会发送事件。
Observable的分类
Cold Observable
我们经常用到的就是这种,它的特点是一个被观察者对应一个观察者,只有被观察者订阅了观察者,才会开始发送事件,上面强调的也是这个意思。当有多个不同的观察者时,消息(事件)是重新完整发送的,也就是说它们各自的事件是独立的。
Consumer<Long> subscribe1 = new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
System.out.println("subscriber1: "+aLong);
}
};
Consumer<Long> subscribe2 = new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
System.out.println(" subscriber2: "+aLong);
}
};
Observable<Long> observable = Observable.create(new ObservableOnSubscribe<Long>() {
@Override
public void subscribe(ObservableEmitter<Long> emitter) throws Exception {
Observable.interval(10, TimeUnit.MILLISECONDS, Schedulers.computation())
.take(Integer.MAX_VALUE)
.subscribe(emitter::onNext);
}
}).observeOn(Schedulers.newThread());
observable.subscribe(subscribe1);
observable.subscribe(subscribe2);
//测试结论
//accept的回调里面打印的subscribe1 和 subscribe2 的结果并不一定是相同的,说明它们两个是完全独立的。
Hot Observable
Hot Observable与观察者们的关系是一对多的关系,可以和多个观察者共享信息。无论有没有观察者进行订阅,事件始终都会被发送。
由于这种用法不多,所以这里就不使用代码做解释了。
Observable的基本使用
其实上面的例子中已经可以看到Observable的基本用法了,下面通过代码抽象出一个简单框架,再次了解一下它的含义及用法,其中这几个角色缺一不可。
- 创建Observable
Observable字面意思是被观察者,可以在这里决定异步操作模块的顺序和异步操作模块的次数。 - 创建Observer
Observer即观察者,它可以在不同的线程中执行任务。可以在未来某一时刻响应被观察者的通知,而不需要阻塞等待Observable发射数据。 - 使用subscribe()进行订阅
Observable.just("hello world").subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
关于上述代码的一些解释
- 使用了just操作符创建了Observable,我们还可以使用create、range等一些操作符来创建,这里不一一举例,有兴趣可以自行查阅相关资料了解用法,其实大同小异。
- just()方法里面传递了字符串参数,则会在Observer的回调onNext()方法里面收到这个参数,这个是描述了一边发事件,另外一边可以收到通知的思想。
- 关于Observer的回调,onError()和onComplete()方法只会回调其中一个方法,因为他们是冲突的,且只会在最后回调。
单纯从写法上来讲,Observable其实很简单,就是一些固定的格式,写多了自然就记住了。但是我们如果想要了解为什么Observable可以自由切换线程去完成对应的任务,就需要去读一下Observable的源码。
这篇文章是个人学习Observable的一些简单总结,所以不针对源码做过多解释。
最后,如果你想要系统学习一下RxJava,建议看《RxJava 2.x实战》这本书,作者是沈哲。有建议或者不足之处欢迎下方评论留言,抱拳了。