记录RxJava + Retrofit一些常用的使用场景
简介
RxJava是非常强大的函数响应式编程库,Retrofit是非常强大的网络请求框架。强强结合,最佳结合体验,让代码更丝滑。
RxJava的强大,不仅仅是结合网络请求,在其他的场景,如按钮防抖动、定时器、数据库异步操作等等,应用也非常广泛,强烈建议学习使用。
使用场景
轮询请求
定时轮询
1
2
3
4
5
6
7
8
9// 每隔5分钟请求Token
Observable.interval(5, TimeUnit.MINUTES).flatMap(new Func1<Object, Observable<Object>>() {
public Observable<Object> call(Object obj) {
return mService.getToken();
}
}).observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe();条件轮询
1
2
3
4
5
6
7
8
9
10
11
12
13
14// 结果不为空时,则停止,否则继续请求
Observable.from(list).flatMap(new Func1<Object, Observable<Object>>() {
public Observable<Object> call(Object obj) {
return mService.getToken();
}
}).takeUntil(new Func1<Response<String>, Boolean>() {
public Boolean call(Response<String> result) {
return result.code() == HTTP_OK && isNotEmpty(result);
}
}).observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe();
链式请求
RxJava配合链式请求,就不需要使用嵌套的形势,一层嵌一层在回调里去请求了。
1 | // 登陆 -> 请求Token -> 请求分类 -> 请求列表 |
多个请求结果合并
1 | Observable<Object> observable1 = mServer.getCategory(); |
多个请求结果不合并
该场景会存在一个问题,如果中途某个请求出现异常,则会中断,后续不再请求。暂时没有想到什么办法避免或者是出现异常继续请求。
1 | Observable.from(appInfoList).flatMap(new Func1<AppLog, Observable<LogInfo>>() { |