RxJava概念
RxJava是一个在Java VM上使用可观测的序列来组成异步的、基于事件的程序库。
RxJava的异步实现,是通过一种扩展的观察者模式来实现的。这也是基于“响应式编程”的概念。在RxJava的观察者模式中,如果没有观察者,被观察者不会发出事件的。
RxJava相对于AsyncTask 和Handler,优势在于随着程序逻辑变得愈加复杂,依旧可以保持简洁。
RxJava名词解释
map(), flatMap(), distinct(), filter(), take() – 这些就是操作符。它们可以修改被传出的数据 - 一个接着一个按照流水线式操作数据。
subscribeOn() – 告诉 Observable 当 subscribe() 方法被调用后它应该在哪个线程被启动。接着每个操作符都会在那个线程工作直到我们改变线程。
observeOn() – 改变下一个操作符的工作线程。每个在这个方法之后的操作符都会在它指定的新的线程里工作,直到我们通过别的 observeOn() 改变线程。
常用操作符
map()转换操作符将已有的对象一对一转换成别的对象,从而获取需要的数据。即分流。
flatMap()操作符可以将已有的对象一对多转化成别的对象。
distinct()这个操作符用来处理重复项,并且它不会让任何已经通过的相同字符串再次通过。每个都是 DISTINCT (独特的)。
filter()操作符就是个简单的对/错判断表达式。
take()操作符 TAKES (取出)指定数量的信息。
flatMap() 与 map()联系
相同点:它也是把传入的参数转化之后返回另一个对象。
不同点:flatMap() 中返回的是个 Observable 对象,并且这个 Observable 对象并不是被直接发送到了 Subscriber 的回调方法中。
flatMap() 的原理是这样的:
- 使用传入的事件对象创建一个 Observable 对象;
- 并不发送这个 Observable, 而是将它激活,于是它开始发送事件;
- 每一个创建出来的 Observable 发送的事件,都被汇入同一个 Observable ,而这个 Observable 负责将这些事件统一交给 Subscriber 的回调方法。这三个步骤,把事件拆成了两级,通过一组新创建的 Observable 将初始的对象『铺平』之后通过统一路径分发了下去。而这个『铺平』就是 flatMap() 所谓的 flat。
拓展:由于可以在嵌套的 Observable 中添加异步代码, flatMap() 也常用于嵌套的异步操作,例如嵌套的网络请求Retrofit + RxJava结合的网络请求框架。对比以往的在callback中实现嵌套请求,flatMap() 的链式潜逃使逻辑更清晰。
Retrofit + RxJava网络请求框架
Retrofit + RxJava模式下,Retrofit 把请求封装进 Observable ,在请求结束后调用 onNext() 或在请求失败后调用 onError()。
传统的Retrofit模式下,Retrofit 提供了 Callback 形式的 API回调请求返回的数据。
Retrofit + RxJava优势:
场景:网络请求返回的数据并不应该直接显示,而是需要先与数据库中的数据进行比对和修正后(耗时操作)再显示。
传统的办法是在请求接口回调后再进行数据库对比,这里若没在自线程中进行易造成ANR,若new Thread()方式在子线程中进行会对代码的可读性有影响。
而Retrofit + RxJava模式下,直接在链式代码中进行数据库操作,然后切换主线程来显示最终数据。逻辑简洁清晰。
以上是对RxJava的初步学习,未完待续~