Retrofit和RxJava:将Flowable与Observable结合起来得到结果

时间:2017-12-12 21:03:28

标签: android retrofit rx-java2

我想将Flowable与Observable结合起来,从这些来源创建一个模型。

从房间我获得CartModel项目,此模型包含产品和数量的ID。

  @Override
        public Flowable<List<CartModel>> getCartItems() {
            return appLocalDataStore.getCartItems();
        }

之后我有一个函数,对于上面的每个id函数组成一对数量和产品细节。

@Override
public Observable<List<Pair<WsProductDetails, Integer>>> getCartWithProductData() {
    return appLocalDataStore.getCartItems().toObservable().flatMap(new Function<List<CartModel>, ObservableSource<CartModel>>() {
        @Override
        public ObservableSource<CartModel> apply(List<CartModel> cartModels) throws Exception {
            return Observable.fromIterable(cartModels);
        }
    }).flatMap(new Function<CartModel, ObservableSource<Pair<WsProductDetails, Integer>>>() {
        @Override
        public ObservableSource<Pair<WsProductDetails, Integer>> apply(final CartModel cartModel) throws Exception {
            return appRemoteDataStore.getProductBySKU(cartModel.getId()).map(new Function<WsProductDetails, Pair<WsProductDetails, Integer>>() {
                @Override
                public Pair<WsProductDetails, Integer> apply(WsProductDetails wsProductDetails) throws Exception {
                    Log.d("TestCartItems", "SKU" + wsProductDetails.getSku() + "  quantity" + cartModel.getQuantity());
                    return new Pair<>(wsProductDetails, cartModel.getQuantity());
                }
            });
        }
    }).toList().toObservable();
}   

 @GET(PATH_PRODUCT_DETAILS_BY_SKY)
    Observable<WsProductDetails> getProductBySKU(@Path(PATH_CODE) String cod);

以上功能正常,因为日志是核心。

但在My Presenter OnNext()|| OnError()|| onComplete()函数永远不会被调用。 为什么会这样?

@Override
    public void getCartItems() {
        Observable<List<Pair<WsProductDetails, Integer>>> source = appDataStore.getCartWithProductData();
        mCompositeDisposable.add(source
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribeWith(new DisposableObserver<List<Pair<WsProductDetails, Integer>>>() {
                    @Override
                    public void onComplete() {
                        Log.d(TAG, "onComplete()");
                    }

                    @Override
                    public void onNext(List<Pair<WsProductDetails, Integer>> pairs) {
                        Log.d(TAG, "onError()");
                        view.showCartItems(pairs);
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "onError()");
                    }
                }));

    }
}

1 个答案:

答案 0 :(得分:0)

您必须将查找flatMap应用于内部fromIterable,以便它变得有限:

@Override
public Observable<List<Pair<WsProductDetails, Integer>>> getCartWithProductData() {
    return appLocalDataStore.getCartItems().toObservable().flatMap(new Function<List<CartModel>, ObservableSource<CartModel>>() {
        @Override
        public ObservableSource<CartModel> apply(List<CartModel> cartModels) throws Exception {
            return Observable.fromIterable(cartModels)
                .flatMap(new Function<CartModel, ObservableSource<Pair<WsProductDetails, Integer>>>() {
                    @Override
                    public ObservableSource<Pair<WsProductDetails, Integer>> apply(final CartModel cartModel) throws Exception {
                        return appRemoteDataStore.getProductBySKU(cartModel.getId())
                            .map(new Function<WsProductDetails, Pair<WsProductDetails, Integer>>() {
                             @Override
                             public Pair<WsProductDetails, Integer> apply(WsProductDetails wsProductDetails) throws Exception {
                                 Log.d("TestCartItems", "SKU" + wsProductDetails.getSku() + "  quantity" + cartModel.getQuantity());
                                 return new Pair<>(wsProductDetails, cartModel.getQuantity());
                             }
                         });
                     }
                }).toList().toObservable();
        }
    });
}