欢迎使用CSDN-markdown编辑器
来源:互联网 发布:百度软件管家电脑版 编辑:程序博客网 时间:2024/06/05 15:33
Rx是一个函数库,让开发者可以利用可观察序列和LINQ风格查询操作符来编写异步和基于事件的程序
一脸懵B
看到这个定义我只能呵呵,稍微通俗点说是这样的:
Rx是微软.NET的一个响应式扩展。Rx借助可观测的序列提供一种简单的方式来创建异步的,基于事件驱动的程序。
这个有点清晰了,至少看到我们熟悉的异步与事件驱动,所以简单点且不准确地来说:
Rx就是一种响应式编程,来创建基于事件的异步程序
注意,这个定义是不准确的,但是对于初学者来说,已经可以有个基本的认知了。
另外还有一点就是Rx其实是一种编程思想,用很多语言都可以实现,比如RxJava、RxJS、RxPHP等等。而现在我们要说的就是RxJava。
RxJava是什么
二话不说,先上定义:
RxJava就是一种用Java语言实现的响应式编程,来创建基于事件的异步程序
有人问你这不是废话么,好吧那我上官方定义:
一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库
反正我刚看这句话的时候也呵呵了,当然现在有所领悟了。
除此之外,扔物线老师总结的就更精辟了:异步,它就是一个实现异步操作的库。
扩展的观察者模式
对于普通的观察者模式,这里我就不细说了。简单概括就是,观察者(Observer)需要在被观察者(Observable)变化的一瞬间做出反应。
而两者通过注册(Register)或者订阅(Subscribe)的方式进行绑定。
就拿扔物线老师给的例子来说,我丰富了一下如图所示:
观察者模式
其中这个Button就是被观察者(Observable),OnClickListener就是观察者(Observer),两者通过setOnClickListener达成订阅(Subscribe)关系,之后当Button产生OnClick事件的时候,会直接发送给OnClickListener,它做出相应的响应处理。
当然还有其他的例子,比如Android四大组件中的ContentProvider与ContentObserver之间也存在这样的关系。
而RxJava的观察者模式呢,跟这个差不多,但是也有几点差别:
Observer与Observable是通过 subscribe() 来达成订阅关系。
RxJava中事件回调有三种:onNext() 、 onCompleted() 、 onError() 。
如果一个Observerble没有任何的Observer,那么这个Observable是不会发出任何事件的。
其中关于第三点,这里想说明一下,在Rx中,其实Observable有两种形式:热启动Observable和冷启动Observable。
热启动Observable任何时候都会发送消息,即使没有任何观察者监听它。
冷启动Observable只有在至少有一个订阅者的时候才会发送消息
这个地方虽然对于初学者来说区别不大,但是要注意一下,所以上面的第三点其实就针对于冷启动来说的。
另外,关于RxJava的回调事件,扔物线老师总结的很好,我就不班门弄斧了:
onNext():基本事件。
onCompleted(): 事件队列完结。RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的 onNext() 发出时,需要触发 onCompleted() 方法作为标志。
onError(): 事件队列异常。在事件处理过程中出异常时,onError() 会被触发,同时队列自动终止,不允许再有事件发出。
值得注意的是在一个正确运行的事件序列中, onCompleted() 和 onError() 有且只有一个,并且是事件序列中的最后一个。如果在队列中调用了其中一个,就不应该再调用另一个。
好了,那我们也附一张图对比一下吧:
RxJava观察者模式
如何实现RxJava
关于实现RxJava的步骤,扔物线老师已经说的非常好了,这里我就大体总结概括一下。
创建Observer
在Java中,一想到要创建一个对象,我们马上就想要new一个。没错,这里我们也是要new一个Observer出来,其实就是实现Observer的接口,注意String是接收参数的类型:
//创建Observer
Observer observer = new Observer() {
@Override
public void onNext(String s) {
Log.i(“onNext —> “, “Item: ” + s);
}
@Overridepublic void onCompleted() { Log.i("onCompleted ---> ", "完成");}@Overridepublic void onError(Throwable e) { Log.i("onError ---> ", e.toString());}
};
当然这里也要提一个实现了 Observer 接口的抽象类:Subscriber ,它跟 Observer 接口几乎完全一样,只是多了两个方法,看看扔物线老师的总结:
onStart(): 它会在 subscribe 刚开始,而事件还未发送之前被调用,可以用于做一些准备工作,例如数据的清零或重置。这是一个可选方法,默认情况下它的实现为空。需要注意的是,如果对准备工作的线程有要求(例如弹出一个显示进度的对话框,这必须在主线程执行), onStart() 就不适用了,因为它总是在 subscribe 所发生的线程被调用,而不能指定线程。
unsubscribe(): 用于取消订阅。在这个方法被调用后,Subscriber 将不再接收事件。一般在这个方法调用前,可以使用 isUnsubscribed() 先判断一下状态。 要在不再使用的时候尽快在合适的地方(例如 onPause() onStop() 等方法中)调用 unsubscribe() 来解除引用关系,以避免内存泄露的发生。
虽然多了两个方法,但是基本实现方式跟Observer是一样的,所以暂时可以不考虑两者的区别。不过值得注意的是:
实质上,在 RxJava 的 subscribe 过程中,Observer 也总是会先被转换成一个 Subscriber 再使用。
创建Observable
与Observer不同的是,Observable是通过 create() 方法来创建的。注意String是发送参数的类型:
//创建Observable
Observable observable = Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- VS2017+Opencv3.3+Opencv_contribute编译
- 01背包和完全背包
- face-alignment:用 pytorch 实现的 2D 和 3D 人脸对齐库
- ARM裸机编程需要知道的汇编知识1---可编程逻辑器件
- power
- 欢迎使用CSDN-markdown编辑器
- Sqoop
- JS动态调用方法名示例
- Java集合归纳-<四>List
- SSM:spring+springmvc+mybatis框架中的XML配置文件功能
- HDOJ1010(深搜+剪枝)
- 股票数据
- Spark1.6内存管理
- Qt在Windows下的三种编程环境搭建