需求

有这样一个列表数据,它包含了商店+订单的信息,获取订单列表时,订单实体中会包含商店的 ID,而列表显示时需要商店的名称和 logo,这时候就需要进行嵌套串行网络请求了。

关键词

flatMap缓存RetrofitRxJava

动手

(1)使用 Retrofit 定义网络接口

// RemoteService.java
// 请求订单信息
@POST("/order/v1/order_history")
Single<List<OrderResponse>> queryOrderList(@Body FetchOrderHistoryRequest request);
// 请求商店信息
@POST("/store/v1/store_query")
Single<StoreResponse> queryStore(@Body StoreQueryRequest request);

(2)使用 DataManager 管理数据

// DataManager.java
// 请求订单信息
public Single<List<OrderResponse>> 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<StoreResponse> queryStore(String storeId) {
String storeKey = PrefConstant.getStoreKey(storeId);
String storeJson = mMemberPref.getString(storeKey, null);
Single<StoreResponse> 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;
}

注:

  1. mMemberPref 是我写的一个使用 SharedPreferences 进行数据缓存的类,详情查看 Pref.java

(3)多次FlatMap

dataManager.queryOrderList(status)
.flatMapObservable((Function<List<OrderResponse>, ObservableSource<OrderResponse>>) Observable::fromIterable)
.flatMap((Function<OrderResponse, ObservableSource<OrderHolder>>) orderResponse -> {
OrderHolder orderHolder = new OrderHolder();
orderHolder.setOrder(orderResponse);
return dataManager.queryStore(orderResponse.getStoreId())
.flatMapObservable((Function<StoreResponse, ObservableSource<OrderHolder>>) storeResponse -> {
orderHolder.setStore(storeResponse);
return Observable.just(orderHolder);
});
})
.toList()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new SingleObserver<List<OrderHolder>>() {
@Override
public void onSubscribe(Disposable d) {
disposable = d;
} @Override
public void onSuccess(List<OrderHolder> orderHolders) {
if (orderHolders != null && !orderHolders.isEmpty()) {
getMvpView().showOrderList(orderHolders);
} else {
getMvpView().showEmpty();
}
} @Override
public void onError(Throwable e) {
Timber.e(e);
getMvpView().showError();
}
});
}

说明:

  1. 第一次 flatMapObservable ,将 List<OrderResponse> 转为 ObservableSource<OrderResponse>
  2. 第二次 flatMap,将 OrderResponse 转为 ObservableSource<OrderHolder>
  3. 第三次 flatMapObservable ,将 StoreResponse 合并到 OrderHolder,再转为ObservableSource<OrderHolder>

最新文章

  1. docker在centos7下的一些坑
  2. Android 无标题、全屏设置
  3. 開啟apache的日誌功能,但是不記錄.js;.css;.jpg;.ico;.png等訪問記錄
  4. How to implement an algorithm from a scientific paper
  5. CentOS 6.4 下搭建 MongoDB 2.4.9 环境
  6. Project Euler 83:Path sum: four ways 路径和:4个方向
  7. Jquery 自定义事件实现发布/订阅
  8. 对vector等STL标准容器的排序操作
  9. ueditor使用中的坑
  10. 51nod1046快速幂取余
  11. Delphi实现HTMLWebBrowser实现HTML界面
  12. ThinkPHP模版验证要注意的地方
  13. js模块编写
  14. 【Unity3D与23种设计模式】桥接模式(Bridge)
  15. Salesforce的对象关系
  16. python爬虫实例项目大全
  17. 用简单的代码让一组静态图片变成gif动画
  18. 2017-2018-2 20155303『网络对抗技术』Exp4:恶意代码分析
  19. JSP基本_EL式
  20. VGA Signal Timing

热门文章

  1. SCUT 125 :笔芯回文(DP)
  2. Codeforces 758D:Ability To Convert(思维+模拟)
  3. orm的操作
  4. UAVStack的慢SQL数据库监控功能及其实现
  5. c++字符数组
  6. kuangbin专题 专题二 搜索进阶 Nightmare Ⅱ HDU - 3085
  7. 你不得不知的几个互联网ID生成器方案
  8. Jenkins构建部署jar/war后,服务无法在后台持续运行的解决方案
  9. 多线程总结-同步之ReentrantLock
  10. Spring+MyBatis时Access denied for user &#39;&#233;&#171;˜&#230;&#172;&#162;&#230;&#172;&#162;&#39;@&#39;localhost&#39; (using password: YES)的异常解决方案