java request含嵌套_使用 RxJava 进行嵌套串行网络请求的一种方法
需求
有这样一个列表数据,它包含了商店+订单的信息,获取订单列表时,订单实体中会包含商店的 ID,而列表显示时需要商店的名称和 logo,这时候就需要进行嵌套串行网络请求了。
关键词
flatMap 、缓存 、Retrofit、RxJava
动手
(1)使用 Retrofit 定义网络接口
// RemoteService.java
// 请求订单信息
@POST("/order/v1/order_history")
Single> queryOrderList(@Body FetchOrderHistoryRequest request);
// 请求商店信息
@POST("/store/v1/store_query")
Single queryStore(@Body StoreQueryRequest request);
(2)使用 DataManager 管理数据
// DataManager.java
// 请求订单信息
public Single> queryOrderList(String status) {
FetchOrderHistoryRequest request = new FetchOrderHistoryRequest();
request.setStatus(status);
return mRemoteService.queryOrderList(request);
}
// 请求商店信息,并缓存 5min,如果不作缓存可能导致多次重复请求同一数据
public static final int DEFAULT_CACHE_TIME_MILLIS = 5 * 60 * 1000; // 5min
public Single queryStore(String storeId) {
String storeKey = PrefConstant.getStoreKey(storeId);
String storeJson = mMemberPref.getString(storeKey, null);
Single storeSingle;
if (!TextUtils.isEmpty(storeJson)) {
storeSingle = Single.just(Json.fromJson(storeJson, StoreResponse.class));
} else {
StoreQueryRequest request = new StoreQueryRequest();
request.setId(storeId);
storeSingle = mRemoteService.queryStore(request)
.doOnSuccess(storeResponse -> mMemberPref.put(storeKey,
Json.toJson(
storeResponse),
DEFAULT_CACHE_TIME_MILLIS));
}
return storeSingle;
}
注:
mMemberPref 是我写的一个使用 SharedPreferences 进行数据缓存的类,详情查看 Pref.java
(3)多次FlatMap
dataManager.queryOrderList(status)
.flatMapObservable((Function, ObservableSource>) Observable::fromIterable)
.flatMap((Function>) orderResponse -> {
OrderHolder orderHolder = new OrderHolder();
orderHolder.setOrder(orderResponse);
return dataManager.queryStore(orderResponse.getStoreId())
.flatMapObservable((Function>) storeResponse -> {
orderHolder.setStore(storeResponse);
return Observable.just(orderHolder);
});
})
.toList()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new SingleObserver>() {
@Override
public void onSubscribe(Disposable d) {
disposable = d;
}
@Override
public void onSuccess(List orderHolders) {
if (orderHolders != null && !orderHolders.isEmpty()) {
getMvpView().showOrderList(orderHolders);
} else {
getMvpView().showEmpty();
}
}
@Override
public void onError(Throwable e) {
Timber.e(e);
getMvpView().showError();
}
});
}
说明:
第一次 flatMapObservable ,将 List 转为 ObservableSource;
第二次 flatMap,将 OrderResponse 转为 ObservableSource;
第三次 flatMapObservable ,将 StoreResponse 合并到 OrderHolder,再转为ObservableSource。
java request含嵌套_使用 RxJava 进行嵌套串行网络请求的一种方法相关推荐
- linux通过java获取root权限_通过可写文件获取Linux root权限的5种方法
Linux系统中,全部都是以文件形式存在的,包括目录.设备都是有权限的,共有读.写.可执行三种.管理员为文件设置好权限后,应该要考虑哪些Linux用户会被允许和限制上述的三个权限. 通过可写脚本进行r ...
- Android RxJava应用:优雅实现网络请求轮询(无条件)
前言 Rxjava,由于其基于事件流的链式调用.逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎. 今天,我将为大家带来 Rxjava创建操作符的常见开发应用场景:轮询需求 ...
- java get请求 参数_HttpServletRequest获取GET请求参数5种方法
首页 > Java Web > SpringMvc应用 > HttpServletRequest HttpServletRequest获取GET请求参数5种方法 HttpServle ...
- Java运行非Web的Springboot项目(测试类或启动主类两种方法)
Java运行非Web的Springboot项目(测试类或启动主类两种方法) 前言 一.创建打开一个Springboot项目 二.运行项目 1.Test测试类运行 2.启动主类运行 三.持续运行不停止( ...
- java发送get请求_java发送http get请求的两种方法(总结)
长话短说,废话不说 一.第一种方式,通过HttpClient方式,代码如下: public static String httpGet(String url, String charset) thro ...
- java简单ai聊天_一个hello/hi的简单的网络聊天程序——JAVA
1.方案介绍 应用程序通过使用用于描述IP地址和端口的"套接字"-Socket向网络发出请求或应答网络请求.Socket和ServerSocket类库位于Java.net包中.前者 ...
- java sql 写入万条数据_如何快速向数据库插1000万数据?4种方法对比,它简单却速度最快
目录 场景介绍 项目配置 Mybatis为什么慢? JdbcTemplate让我眼前一亮 原生JDBC就是快啊! 存储过程怎么样? 越简单越快 前言 一直有一种说法:批量插入大量数据到MySQL数据库 ...
- java 内部类 单例_确保对象的唯一性——单例模式 (四):一种更好的单例实现方法(静态内部类)...
3.5 一种更好的单例实现方法 饿汉式单例类不能实现延迟加载,不管将来用不用始终占据内存:懒汉式单例类线程安全控制烦琐,而且性能受影响.可见,无论是饿汉式单例还是懒汉式单例都存在这样那样的问题,有没有 ...
- kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式...
2019独角兽企业重金招聘Python工程师标准>>> 今天要说的干货是:以Kotlin,在MVP模式下(OKHttp和 Retrofit+RxJava)网络请求两种实现方式的一个小 ...
- java在文件的后面添加_java 在file的尾部添加数据的两种方法总结
java 在file的尾部添加数据的两种方法总结 问题描述: 在文件的末尾追加内容 方法1:利用RandomAccessFile类 1.将randomAccessFile模式设置为rw 2将rando ...
最新文章
- JAVA - HashMap和HashTable
- FIA2020会议准备相关工作
- OpenGL硬件加速指南
- c语言职专试题及答案,中等职业学校计算机应用专业c语言编程基础科试卷及答案.doc...
- CAD计算机辅助设计与BIM的区别,3D建模、CAD和BIM三者之间的差异是什么,有什么区别?...
- python生成序列数(1-10)的立方列表_Python 4.3 创建数值列表(动手试一试)
- mysql5.7建库建表_MySQL5.7 建库建表的命令
- es6语法在ios低版本的支持性
- Spring Boot Questions- Part 1
- 用c语言电脑系统指令,c语言文件 DOS命令大全(10)
- 考个ISTQB证书有用吗
- 提取网页内容-Python
- 树莓派Python 按键实验
- Windows下HdWiki安装步骤
- 让你的BT迅雷下载速度提升十倍以上....
- TPTP Web性能监控
- 熟读100句英文,记7000单词
- 程序员后来都干啥去了
- python绘制花朵图案_Python实现平行坐标图的绘制(plotly)方式
- 谐振电路的品质因数(Q值)zz
热门文章
- Does Your Wooden Surface Really Need Sealing?
- 判断闰年的方法以及如何获得单链表的倒数第K个元素
- 【德】博多·费舍尔 - 小狗钱钱2(2013年7月27日)
- 一个简单的EXCEL 导入SQL 的例子
- android 好看的计算器,从未见过如此丑的计算器 – 计算管家 #Android
- 计算机网络物理层之物理层的基本概念
- Kubernetes详解(二十)——ReplicaSet控制器
- zabbix详解(十一)——zabbix监控MySQL性能实战
- Leetcode 刷题笔记(二十六) ——动态规划篇之经典问题:打家劫舍
- HDOJ--2112--