使用 RxJava 进行嵌套串行网络请求的一种方法
发布时间:2020-12-15 05:23:48 所属栏目:Java 来源:网络整理
导读:需求 有这样一个列表数据,它包含了商店+订单的信息,获取订单列表时,订单实体中会包含商店的 ID,而列表显示时需要商店的名称和 logo,这时候就需要进行嵌套串行网络请求了。 关键词 flatMap 、 缓存 、 Retrofit 、 RxJava 动手 (1)使用 Retrofit 定义
需求有这样一个列表数据,它包含了商店+订单的信息,获取订单列表时,订单实体中会包含商店的 ID,而列表显示时需要商店的名称和 logo,这时候就需要进行嵌套串行网络请求了。 关键词
动手(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; } 注:
(3)多次FlatMapdataManager.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(); } }); } 说明:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- java – Android Webview,缩放内容以适应屏幕
- java – 迭代列表,修改每个元素:有更快的方法吗?
- 汇编 – 有时为什么我们需要在启用A20时禁用中断?
- java – 尝试使用tomcat-maven-plugin部署maven项目时出现错
- java – 哪个JVM打印出这样的线程转储?
- Comet OJ - Contest #8
- java – Spring是否为执行Hystrix命令的线程提供SecurityCo
- java图像处理之倒角距离变换
- Selenium Standalone Server和Java selenium Jar文件之间有
- MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)