简介
RxJava是 ReactiveX 在JVM上的一个实现,它为观察者模式提供了一种通用的实现,并且提供了丰富的操作符来处理数据流。它同时支持不同线程之间切换,使得它经常用来实现Android中的异步调用
github地址:https://github.com/ReactiveX
一些学习链接: http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0430/2815.html
RxJava2.x 参考链接:https://www.jianshu.com/c/299d0a51fdd4
这可能是最好的RxJava 2.x 教程(完结版):https://www.jianshu.com/p/0cd258eecf60
给 Android 开发者的 RxJava 详解:http://gank.io/post/560e15be2dca930e00da1083#toc_5
以下为近期学习的笔记部分:
1. Okhttp的引入依赖
链接:https://blog.csdn.net/xx326664162/article/details/77714126
compile 'com.squareup.okhttp3:okhttp:3.2.0'
2. 引入RxJava的依赖
compile 'io.reactivex.rxjava2:rxjava:2.1.0'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
3. 参考文章链接
1.X :http://gank.io/post/560e15be2dca930e00da1083#toc_5
2.X :https://www.jianshu.com/p/0cd258eecf60
4. 要点笔记
这里出现了一个叫做 Func1 的类。它和 Action1 非常相似,也是 RxJava 的一个接口,用于包装含有一个参数的方法。 Func1 和 Action 的区别在于, Func1 包装的是有返回值的方法。 另外,和 ActionX 一样, FuncX 也有多个,用于不同参数个数的方法。FuncX 和 ActionX 的区别在 FuncX 包装的是有返回值的方法。
5. 关于onComplete和onError唯一并且互斥这一点, 是需要自行在代码中进行控制, 如果你的代码逻辑中违背了这个规则,并不一定会导致程序崩溃。
比如发送多个onComplete是可以正常运行的, 依然是收到第一个onComplete就不再接收了,
但若是发送多个onError, 则收到第二个onError事件会导致程序会崩溃.
6. mDisposable – 可在适当位置赋值,并在界面结束的时候,中断事件传递:
@Override
public void onSubscribe(@NonNull Disposable d) {
mDisposable = d;
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mDisposable != null && !mDisposable.isDisposed()) {
mDisposable.dispose();
}
}
7. flatMap
FlatMap将一个发送事件的上游Observable变换为多个发送事件的Observables, 然后将它们发射的事件合并后放进一个单独的Observable里. 如下例:可以在注册有结果返回后,先进行登录请求,有了结果,再进行接下来的处理
.flatMap(new Function<RegisterResponse, ObservableSource<LoginResponse>>() {
@Override
public ObservableSource<LoginResponse> apply(RegisterResponse registerResponse) throws Exception {
return api.login(new LoginRequest());
}
})
8. map
map是RxJava中最简单的一个变换操作符了, 它的作用就是对上游发送的每一个事件应用一个函数, 使得每一个事件都按照指定的函数去变化。如下例:
.map(new Function<Integer, String>() {
@Override
public String apply(Integer integer) throws Exception {
return "This is result " + integer;
}
})
9. Scheduler 的 API (一)
在RxJava 中,Scheduler ——调度器,相当于线程控制器,RxJava 通过它来指定每一段代码应该运行在什么样的线程。
RxJava 已经内置了几个 Scheduler ,它们已经适合大多数的使用场景: Schedulers.immediate(): 直接在当前线程运行,相当于不指定线程。这是默认的cheduler。 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。
另外, Android 还有一个专用的 AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。
有了这几个 Scheduler ,就可以使用 subscribeOn() 和 observeOn() 两个方法来对线程进行控制了。
* subscribeOn(): 指定 subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程。
* observeOn(): 指定 Subscriber 所运行在的线程。或者叫做事件消费的线程。
10. Zip
Zip通过一个函数将多个Observable发送的事件结合到一起,然后发送这些组合到一起的事件. 它按照严格的顺序应用这个函数。它只发射与发射数据项最少的那个Observable一样多的数据。