RxJavaを使用してネストされたシリアルネットワーク要求を行う方法

4182 ワード

需要
ショップ+受注の情報が含まれているリストデータがあり、受注リストを取得すると、受注エンティティにショップのIDが含まれ、リスト表示にショップの名前とロゴが必要になり、ネストされたシリアルネットワーク要求が必要になります.
キーワードflatMap RetrofitRxJava
に着手
(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は、ListObservableSourceに変更した.
  • は2回目のflatMapで、OrderResponseObservableSourceに変えた.
  • は3回目のflatMapObservableで、StoreResponseOrderHolderに合併し、ObservableSourceに転換した.

  • 転載先:https://www.cnblogs.com/lshare/p/11333983.html