合并多个网络请求rxjava
来源:互联网 发布:医技软件 编辑:程序博客网 时间:2024/06/05 16:55
在项目中出现要获取用户的三个部分的信息,决定在登录后直接全部获取保存在本地。
在学习rxjava中,发现有多种实现方式。
刚开始采用zip:
flowable1,flowable2,flowable3分別为3个网络请求。
Flowable.zip(flowable1, flowable2, flowable3, new Function3<UserInfo, ShopInfo, UserProfile, LoginInfo>() { @Override public LoginInfo apply(UserInfo userInfo, ShopInfo shopInfo, UserProfile userProfile) throws Exception { LoginInfo loginInfo = new LoginInfo(); loginInfo.profile = userProfile; loginInfo.user = userInfo; loginInfo.shop = shopInfo; return loginInfo; }}).subscribeWith(new HttpResultSubscriber<LoginInfo>() { @Override public void onNext(LoginInfo loginInfo) { callBack.setInfo(loginInfo);//回调处理 } @Override public void onError(Throwable t) { super.onError(t); }});由于三个请求是合并后同时发送,因此如果有一个请求事件出错,便进入到onError
即使有其他请求通过,也无法走到onNext
然而为了保存其中某些请求的数据,我们需要用另一种方式把每个事件都进行处理。
刚开始采用merge
Flowable.merge(flowable1, flowable2, flowable3) .subscribeWith(new HttpResultSubscriber<Object>() { @Override public void onNext(Object object) { LoginInfo loginInfo = new LoginInfo(); if (object instanceof UserInfo) { loginInfo.user = (UserInfo) object; } if (object instanceof UserProfile) { loginInfo.profile = (UserProfile) object; } if (object instanceof ShopInfo) { loginInfo.shop = (ShopInfo) object; } callBack.setInfo(loginInfo);//回调处理 } } );但是发现retrofit的interceptor会报错,“ java.io.InterruptedIOException: thread interrupted”,目测是发送请求过快导致的。
查询资料发现merge是不按顺序发送事件,更换用顺序发送的concat之后没有出错。
Flowable.concat(flowable1, flowable2, flowable3) .subscribeWith(new HttpResultSubscriber<Object>() { @Override public void onNext(Object object) { LoginInfo loginInfo = new LoginInfo(); if (object instanceof UserInfo) { loginInfo.user = (UserInfo) object; } if (object instanceof UserProfile) { loginInfo.profile = (UserProfile) object; } if (object instanceof ShopInfo) { loginInfo.shop = (ShopInfo) object; } callBack.setInfo(loginInfo);//回调处理 } } );
当然,如果每个请求之间存在先后依赖,则可以使用map或flatMap操作符
例如flowable2和flowable3需要依赖flowable1的数据,则可以利用flatmap和zip结合
略显复杂。。
final Flowable<LoginInfo> flowable = Flowable.zip(flowable2, flowable3, new BiFunction<ShopInfo, UserProfile, LoginInfo>() { @Override public LoginInfo apply(ShopInfo shopInfo, UserProfile userProfile) throws Exception { LoginInfo loginInfo = new LoginInfo(); loginInfo.profile = userProfile; loginInfo.shop = shopInfo; return loginInfo;//flowable2和3数据合并 } });flowable1.flatMap(new Function<UserInfo, Flowable<LoginInfo>>() { @Override public Flowable<LoginInfo> apply(UserInfo userInfo) throws Exception { LoginInfo loginInfo = new LoginInfo(); loginInfo.user = userInfo; callBack.setInfo(loginInfo);//flowable1回调 return flowable; }}).subscribeWith(new HttpResultSubscriber<LoginInfo>() { @Override public void onNext(LoginInfo loginInfo) { callBack.setInfo(loginInfo);//flowable2和3数据合并后的回调 } @Override public void onError(Throwable t) { super.onError(t); }});
目测还可以利用compose,后面再补充。RxJava 着实很强大。
阅读全文
0 0
- 合并多个网络请求rxjava
- Android RxJava+Retrofit 一次(合并)请求多个接口
- rxjava,okhttp 合并请求
- RXJava+Retrofit网络请求
- Okhttp网络请求+Rxjava
- RxJava 合并组合两个(或多个)Observable数据源
- RxJava 合并组合两个(或多个)Observable数据源
- RxJava 初探(网络请求)
- RxJava+retrofit2实现网络请求
- RxJava + Retrofit完成网络请求
- callback网络请求转RxJava
- Rxjava+Retrofit取消网络请求
- Retrofit+RxJava处理网络请求
- RxJava + Retrofit完成网络请求
- Retrofit+RxJava网络请求框架
- Retrofit+Rxjava完成网络请求
- RXjava加okhttp 请求请求网络数据
- Android】RxJava + Retrofit完成网络请求
- 机器学习中的范数
- iOS 7+,使用原生API生成QRCode。
- Android Studio json 数据
- SpringMVC+Hibernate+jQuery+js+css+jsp+nginx整合时,(1)jsp引入js,css无效;(2)插入数据库时某字段为空;(3)web.xml配置完后,从数据库读数
- 数据预处理之缺失值、异常值处理
- 合并多个网络请求rxjava
- python学习—Day18—异常
- java web工程解决跨域
- AndroidStudio3.0 下载使用新功能介绍
- Numpy学习(进阶)
- iOS时间问题
- Linux 进程任务的前后台运行的切换
- LeetCode-38. Count and Say
- U-Boot启动过程完全分析