Rxjava的学习笔记

在一个使用rxjava的大环境下,自己也得赶快跟上步伐。现在先存储点资料。

优势

  • 保持逻辑清晰
  • 很好处理线程切换的问题并保持逻辑清晰
  • 解决回调地狱的问题

知识点

Scheduler线程控制

事件分发

将数组引入后,取出一个个数组进行一个个对应的操作,但并不是使用for循环,而是另一种方式,请看下面

  • just(T...): 将传入的参数依次发送出来。

转换

map 一对一转换

flatMap 一对多转换

另一种扩展:嵌套的异步操作,例如嵌套的网络请求

ZIP合并操作符

直接上代码自行理会:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
subscription = Observable.zip(
返回第一个Observable,
返回第二个Observable,
new Func2<List<Item>, List<ZhuangbiImage>, List<Item>>() {
@Override
public List<Item> call(List<Item> gankItems, List<ZhuangbiImage> zhuangbiImages) {
List<Item> items = new ArrayList<Item>();
for (int i = 0; i < gankItems.size() / 2 && i < zhuangbiImages.size(); i++) {
//进行对应的合并操作,将对应的数据资源加入list集合
items.add(zhuangbiItem);
}
return items;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);

retryWhen 执行完指定操作后返回执行

场景:请求数据->token超时->重新获取token->返回到原先的数据继续请求操作

代码样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
subscription = Observable.create()
.flatMap(new Func1<Object, Observable<FakeThing>>() {
@Override
public Observable<FakeThing> call(Object o) {
return 发现token已过时,直接返回null
}
})
.retryWhen(new Func1<Observable<? extends Throwable>, Observable<?>>() {
@Override
public Observable<?> call(Observable<? extends Throwable> observable) {
return observable.flatMap(new Func1<Throwable, Observable<?>>() {
@Override
public Observable<?> call(Throwable throwable) {
if (throwable instanceof IllegalArgumentException || throwable instanceof NullPointerException) {
return //捕捉指点的异常(是否为token为null的异常)并进行网络请求token
}
return Observable.error(throwable);
}
});
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe();

正如上面所说的:当在flatMap执行时token==null的异常后,retryWhen捕捉执行请求,完成后再次执行flatMap

BehaviorSubject 缓存数据

父类为Subject

方法

  • unsubscribe(): 这是 Subscriber 所实现的另一个接口 Subscription 的方法,用于取消订阅

    在不再使用的时机进行调用,如:onPause(),onStop() 等方法中调用,而且调用之前,最好使用 isUnsubscribed() 先判断一下状态。
    另外一点,最在每次创建Subscription之前就unsubscribe一下,防止该对象由于某种原因还么执行完,继续持有引用而导致内存泄漏的风险。

资料

入门资料:

给 Android 开发者的 RxJava 详解

这个个人认为最好的资料了,没有之一。看一遍不懂,再看几遍吧。对应的demo地址: RxJavaSamples

其他场景分析资料:

错误

java.lang.IllegalArgumentException: Unable to create call adapter for rx.Observable

对应的解决参考: Android应用架构之Retrofit、RxAndroid使用