RxJavaを使用してネストされたシリアルネットワーク要求を行う方法
4182 ワード
需要
ショップ+受注の情報が含まれているリストデータがあり、受注リストを取得すると、受注エンティティにショップのIDが含まれ、リスト表示にショップの名前とロゴが必要になり、ネストされたシリアルネットワーク要求が必要になります.
キーワード
に着手
(1)Retrofitを用いてネットワークインタフェースを定義する
(2)DataManagerによるデータ管理
注意: を参照してください.
(3)複数回FlatMap
説明:最初の は2回目の は3回目の
転載先:https://www.cnblogs.com/lshare/p/11333983.html
ショップ+受注の情報が含まれているリストデータがあり、受注リストを取得すると、受注エンティティにショップのIDが含まれ、リスト表示にショップの名前とロゴが必要になり、ネストされたシリアルネットワーク要求が必要になります.
キーワード
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
に転換した.転載先:https://www.cnblogs.com/lshare/p/11333983.html