需求

有这样一个列表数据,它包含了商店+订单的信息,获取订单列表时,订单实体中会包含商店的 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 进行嵌套串行网络请求的一种方法相关推荐

  1. linux通过java获取root权限_通过可写文件获取Linux root权限的5种方法

    Linux系统中,全部都是以文件形式存在的,包括目录.设备都是有权限的,共有读.写.可执行三种.管理员为文件设置好权限后,应该要考虑哪些Linux用户会被允许和限制上述的三个权限. 通过可写脚本进行r ...

  2. Android RxJava应用:优雅实现网络请求轮询(无条件)

    前言 Rxjava,由于其基于事件流的链式调用.逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎. 今天,我将为大家带来 Rxjava创建操作符的常见开发应用场景:轮询需求 ...

  3. java get请求 参数_HttpServletRequest获取GET请求参数5种方法

    首页 > Java Web > SpringMvc应用 > HttpServletRequest HttpServletRequest获取GET请求参数5种方法 HttpServle ...

  4. Java运行非Web的Springboot项目(测试类或启动主类两种方法)

    Java运行非Web的Springboot项目(测试类或启动主类两种方法) 前言 一.创建打开一个Springboot项目 二.运行项目 1.Test测试类运行 2.启动主类运行 三.持续运行不停止( ...

  5. java发送get请求_java发送http get请求的两种方法(总结)

    长话短说,废话不说 一.第一种方式,通过HttpClient方式,代码如下: public static String httpGet(String url, String charset) thro ...

  6. java简单ai聊天_一个hello/hi的简单的网络聊天程序——JAVA

    1.方案介绍 应用程序通过使用用于描述IP地址和端口的"套接字"-Socket向网络发出请求或应答网络请求.Socket和ServerSocket类库位于Java.net包中.前者 ...

  7. java sql 写入万条数据_如何快速向数据库插1000万数据?4种方法对比,它简单却速度最快

    目录 场景介绍 项目配置 Mybatis为什么慢? JdbcTemplate让我眼前一亮 原生JDBC就是快啊! 存储过程怎么样? 越简单越快 前言 一直有一种说法:批量插入大量数据到MySQL数据库 ...

  8. java 内部类 单例_确保对象的唯一性——单例模式 (四):一种更好的单例实现方法(静态内部类)...

    3.5 一种更好的单例实现方法 饿汉式单例类不能实现延迟加载,不管将来用不用始终占据内存:懒汉式单例类线程安全控制烦琐,而且性能受影响.可见,无论是饿汉式单例还是懒汉式单例都存在这样那样的问题,有没有 ...

  9. kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式...

    2019独角兽企业重金招聘Python工程师标准>>> 今天要说的干货是:以Kotlin,在MVP模式下(OKHttp和 Retrofit+RxJava)网络请求两种实现方式的一个小 ...

  10. java在文件的后面添加_java 在file的尾部添加数据的两种方法总结

    java 在file的尾部添加数据的两种方法总结 问题描述: 在文件的末尾追加内容 方法1:利用RandomAccessFile类 1.将randomAccessFile模式设置为rw 2将rando ...

最新文章

  1. JAVA - HashMap和HashTable
  2. FIA2020会议准备相关工作
  3. OpenGL硬件加速指南
  4. c语言职专试题及答案,中等职业学校计算机应用专业c语言编程基础科试卷及答案.doc...
  5. CAD计算机辅助设计与BIM的区别,3D建模、CAD和BIM三者之间的差异是什么,有什么区别?...
  6. python生成序列数(1-10)的立方列表_Python 4.3 创建数值列表(动手试一试)
  7. mysql5.7建库建表_MySQL5.7 建库建表的命令
  8. es6语法在ios低版本的支持性
  9. Spring Boot Questions- Part 1
  10. 用c语言电脑系统指令,c语言文件 DOS命令大全(10)
  11. 考个ISTQB证书有用吗
  12. 提取网页内容-Python
  13. 树莓派Python 按键实验
  14. Windows下HdWiki安装步骤
  15. 让你的BT迅雷下载速度提升十倍以上....
  16. TPTP Web性能监控
  17. 熟读100句英文,记7000单词
  18. 程序员后来都干啥去了
  19. python绘制花朵图案_Python实现平行坐标图的绘制(plotly)方式
  20. 谐振电路的品质因数(Q值)zz

热门文章

  1. Does Your Wooden Surface Really Need Sealing?
  2. 判断闰年的方法以及如何获得单链表的倒数第K个元素
  3. 【德】博多·费舍尔 - 小狗钱钱2(2013年7月27日)
  4. 一个简单的EXCEL 导入SQL 的例子
  5. android 好看的计算器,从未见过如此丑的计算器 – 计算管家 #Android
  6. 计算机网络物理层之物理层的基本概念
  7. Kubernetes详解(二十)——ReplicaSet控制器
  8. zabbix详解(十一)——zabbix监控MySQL性能实战
  9. Leetcode 刷题笔记(二十六) ——动态规划篇之经典问题:打家劫舍
  10. HDOJ--2112--