如何正确使用Observable.zip()来组合多个Retrofit调用?

时间:2018-01-11 09:15:37

标签: android retrofit2 rx-android

我是RxJava的新手。我的要求是在开始时进行3次改装调用,并等到所有主题都执行完毕。这是我实现的和它完美的工作,但我想知道,这个代码可能比这更好,我是否正确实现了调度程序。

public class CombinedGroupProductPage {
    private List<Product> groupProductList;
    private List<Product> relatedProductList;
    private List<Product> upsellProductList;
    //constructor and getter setters here
    .....
    .....
}
  

这是我的实施

private void getAllData() {
    loadingProgress.setVisibility(View.VISIBLE);

    ApiInterface apiService = ApiClient.getRxClient().create(ApiInterface.class);
    Observable<List<Product>> call = apiService.getRelatedProduct1(gson.toJson(model.getGroupedProducts()))
            .subscribeOn(Schedulers.newThread())
            .observeOn(Schedulers.io());
    Observable<List<Product>> call1 = apiService.getRelatedProduct1(gson.toJson(model.getRelatedIds()))
            .subscribeOn(Schedulers.newThread())
            .observeOn(Schedulers.io());
    Observable<List<Product>> call2 = apiService.getRelatedProduct1(gson.toJson(model.getUpsellIds()))
            .subscribeOn(Schedulers.newThread())
            .observeOn(Schedulers.io());


    Observable<CombinedGroupProductPage> combined = Observable.zip(call, call1, call2, new Function3<List<Product>, List<Product>, List<Product>, CombinedGroupProductPage>() {

        @Override
        public CombinedGroupProductPage apply(List<Product> list, List<Product> list2, List<Product> list3) throws Exception {
            return new CombinedGroupProductPage(list, list2, list3);
        }
    }).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread());
    combined.subscribe(new Observer<CombinedGroupProductPage>() {
        @Override
        public void onSubscribe(Disposable d) {
            // loadingProgress.setVisibility(View.VISIBLE);
        }

        @Override
        public void onNext(CombinedGroupProductPage combinedGroupProductPage) {
            Log.e("Tag", combinedGroupProductPage.toString());
            Log.e("Tag", combinedGroupProductPage.getGroupProductList().get(0).getName());
            loadingProgress.setVisibility(View.GONE);
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onComplete() {

        }
    });
}

请告诉我这个代码可以减少吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

使用Schedulers.io()代替Schedulers.newThread()Schedulers.io()使用线程池而Schedulers.newThread()不使用。创建线程很昂贵,如果可能应该避免。

使用.subscribeOn(Schedulers.io())进行不同的通话也可以删除现在无用的.observeOn(Schedulers.io())