【问题标题】:RxAndroid - 1 Response From Multiple ObservablesRxAndroid - 来自多个 Observables 的 1 个响应
【发布时间】:2016-09-22 21:50:28
【问题描述】:

我正在尝试学习 RxAndroi,所以问题类似于 Title。

来自多个 Observable 的 1 个响应

我想从这 2 个请求中获得 1 个响应。

或者选项编号 2 我也想知道如何同步它们。

在第一个请求完成后执行第二个请求。

示例代码:

 Observable<List<CategoriesTreeModel>> categoriesTreeObservable = ApiManager.getInstanceApi().getCategoriesTree();
         Subscription treeSubscription = categoriesTreeObservable
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<List<CategoriesTreeModel>>() {
                    @Override
                    public void onCompleted() {
                        Log.e("CATALOG", "getCategoriesTree() complete");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e("CATALOG", "getCategoriesTree() error");
                    }

                    @Override
                    public void onNext(List<CategoriesTreeModel> categoriesTreeModels) {
                        Log.e("CATALOG", "getCategoriesTree() next");
                    }
                });



        Observable<ResponseModel<CategoriesResponse>> categoriesObservable = ApiManager.getInstanceApi().getCategories();
        Subscription subscription = categoriesObservable
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<ResponseModel<CategoriesResponse>>() {
                    @Override
                    public void onCompleted() {
                         Log.e("CATALOG", "getCategories() complete");

                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e("CATALOG", "getCategories() error");
                    }

                    @Override
                    public void onNext(ResponseModel<CategoriesResponse> categoriesResponseResponseModel) {
                        Log.e("CATALOG", "getCategories() onNext");


                    }
                });

编辑: 这是一个正确的为什么?

 Observable.zip(categoriesObservable, categoriesTreeObservable, new Func2<ResponseModel<CategoriesResponse>, List<CategoriesTreeModel>, Object>() {
            @Override
            public Object call(ResponseModel<CategoriesResponse> categoriesResponseResponseModel, List<CategoriesTreeModel> categoriesTreeModels) {

                for (int i = 0; i < categoriesResponseResponseModel.getList().size(); i++){
                    Log.e("RESPONSE", "CATEGORIES: " + categoriesResponseResponseModel.getList().get(i).getCategory_id() + " NAME: " + categoriesResponseResponseModel.getList().get(i).getTranslations().getPl_PL().getName());
                }

                for (int i = 0; i < categoriesTreeModels.size(); i++){
                    Log.e("RESPONSE", "TREE: ID " + categoriesTreeModels.get(i).getId() + " CHILD: " + (categoriesTreeModels.get(i).getChildren().size() > 0 ? " has children " : "no child"));
                }

                return null;
            }
        })
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe();

【问题讨论】:

标签: java android rx-java rx-android


【解决方案1】:

阅读一些有关 MVP 模式的内容,以便将数据逻辑与视图逻辑分开。 “在第一个请求完成后执行第二个请求”的最直接解决方案。如下所示。这种模式不是世界上最好的,但至少它会给你一些你可以参考的代码。

final Observable<String> firstObservable = Observable.just("A")
        .delay(5, TimeUnit.SECONDS)
        .doOnNext(new Action1<String>() {
            @Override
            public void call(String s) {
                Log.d(TAG, "call: " + s);
            }
        });

firstObservable
        .subscribe();

final Observable<String> secondObservable = firstObservable
        .flatMap(new Func1<String, Observable<String>>() {
            @Override
            public Observable<String> call(String s) {
                return Observable.just(s + "B").delay(2, TimeUnit.SECONDS); // Make some api call
            }
        });

secondObservable.subscribe(new Action1<String>() {
    @Override
    public void call(String s) {
        Log.d(TAG, "call: " + s);
    }
});

【讨论】:

    猜你喜欢
    • 2018-08-15
    • 2010-10-23
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多