RxJava+Retrofit常用的使用场景

Android

记录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>>() {
    @Override
    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>>() {
    @Override
    public Observable<Object> call(Object obj) {
    return mService.getToken();
    }
    }).takeUntil(new Func1<Response<String>, Boolean>() {
    @Override
    public Boolean call(Response<String> result) {
    return result.code() == HTTP_OK && isNotEmpty(result);
    }
    }).observeOn(AndroidSchedulers.mainThread())
    .subscribeOn(Schedulers.io())
    .subscribe();

链式请求

RxJava配合链式请求,就不需要使用嵌套的形势,一层嵌一层在回调里去请求了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 登陆 -> 请求Token -> 请求分类 -> 请求列表
mService.login(mUrl).flatMap(new Func1<Object, Observable<Object>>() {
@Override
public Observable<Object> call(Object obj) {
return mService.getToken();
}
}).flatMap(new Func1<Object, Observable<Object>>() {
@Override
public Observable<Object> call(Object obj) {
return mService.getCategory();
}
}).flatMap(new Func1<Object, Observable<Object>>() {
@Override
public Observable<Object> call(Object obj) {
return mService.getList();
}
}).observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe();

多个请求结果合并

1
2
3
4
Observable<Object> observable1 = mServer.getCategory();
Observable<Object> observable2 = mServer.getChannel();

Observable.zip(observable1, observable2).subscribe();

多个请求结果不合并

该场景会存在一个问题,如果中途某个请求出现异常,则会中断,后续不再请求。暂时没有想到什么办法避免或者是出现异常继续请求。

1
2
3
4
5
6
7
Observable.from(appInfoList).flatMap(new Func1<AppLog, Observable<LogInfo>>() {
@Override
public Observable<LogInfo> call(AppLog appLog) {
Map<String, String> params = new HashMap<>();
return mInstance.mHttpService.registerLog(REGISTER_APP_LOG, params);
}
}).subscribe();
谢谢老板,请尽情用红包来蹂躏我吧!!!
0%