最近项目不是特别忙,闲下来静下心学习点最近比较火的 RXJava , 花了几天时间系统地查看了相关的资料,写了一些简单的示例
上或者是其他的技术博客上也有好多讲解RxJava的,相比看下来大致都描述的差不多吧,教程不在多,多写Demo 多实践才能记住消化理解。
初识RxJava
Rx的全称是Reactive Extensions,直译过来就是响应式扩展。
Rx基于观察者模式,他是一种编程模型,目标是提供一致的编程接口,帮助开发者更方便的处理异步数据流。
ReactiveX.io给的定义是,Rx是一个使用可观察数据流进行异步编程的编程接口,ReactiveX结合了观察者模式、迭代器模式和函数式编程的精华。
Rx是微软.NET的一个响应式扩展。Rx借助可观测的序列提供一种简单的方式来创建异步的,基于事件驱动的程序。ps: 说白了就是我们熟悉的 异步与事件驱动
RxJava是一种用java语言实现的响应式编程,来创建基于事件的异步程序(得背会这句话,哈哈) 还是那句话 异步就是
观察者模式
观察者(Observer)
观察者(Observable)
订阅(Subscribe)
观察者(Observer)需要在被观察者(Observable)变化的一瞬间做出反应,两者通过注册(Register)或者订阅(Subscribe)的方式进行绑定
其中这个Button就是被观察者(Observable),OnClickListener就是观察者(Observer),两者通过setOnClickListener达成订阅(Subscribe)关系,之后当Button产生OnClick事件的时候,会直接发送给OnClickListener,它做出相应的响应处理。
RxJava的观察者模式
Observer与Observable是通过subscribe()来达成订阅关系。
RxJava中事件回调有三种:onNext()、onCompleted()、onError()。
关于RxJava的回调事件,扔物线老师总结的很好,我就不班门弄斧了:
onNext():基本事件。
onCompleted(): 事件队列完结。RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的 onNext() 发出时,需要触发 onCompleted() 方法作为标志。
onError(): 事件队列异常。在事件处理过程中出异常时,onError() 会被触发,同时队列自动终止,不允许再有事件发出。
值得注意的是在一个正确运行的事件序列中, onCompleted() 和 onError() 有且只有一个,并且是事件序列中的最后一个。如果在队列中调用了其中一个,就不应该再调用另一个。
RxJava 使用
compile'io.reactivex:rxjava:1.1.6'
compile'io.reactivex:rxandroid:1.2.1'
创建Observer
在Java中,一想到要创建一个对象,我们马上就想要new一个。没错,这里我们也是要new一个Observer出来,其实就是实现Observer的接口
创建Observable
与Observer不同的是,Observable是通过create()方法来创建的。注意String是发送参数的类型:
订阅(Subscribe)
在之前,我们创建了 Observable 和 Observer ,现在就需要用subscribe()方法来将它们连接起来,形成一种订阅关系:
Scheduler(线程控制)
在RxJava中,Scheduler相当于线程控制器,可以通过它来指定每一段代码运行的线程。
RxJava已经内置了几个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。
AndroidSchedulers.mainThread(),Android专用线程,指定操作在主线程运行。
那我们如何切换线程呢?RxJava中提供了两个方法:subscribeOn()和observeOn(),两者的不同点在于:
subscribeOn(): 指定subscribe()订阅所发生的线程,即 call() 执行的线程。或者叫做事件产生的线程。
observeOn(): 指定Observer所运行在的线程,即onNext()执行的线程。或者叫做事件消费的线程。
示例Demo源码: RXJava [email protected]:zanyang/RXJava.git