2

I'm trying to learn RxAndroi so question is like on Title.

1 Response From Multiple Observables

I want to get 1 response from this 2 requests.

Or options number 2 I also want know how to synchronize them.

Do second request after first is completed.

Example code:

 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");


                    }
                });

EDIT: It's a correct whay ?

 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();
Esperanz0
  • 1,524
  • 13
  • 35
  • 1
    take a look at the zip operaor http://stackoverflow.com/questions/30219877/rxjava-android-how-to-use-the-zip-operator and do have a look here https://github.com/ReactiveX/RxJava/wiki/Combining-Observables – Raghunandan Aug 12 '16 at 07:06
  • its looks ok but you need to combine them an return a result in call so that when you subscribe you get items emitted in onNext – Raghunandan Aug 12 '16 at 07:33

1 Answers1

-1

Read something about MVP pattern in order to separate data logic from view logic. Most straightforward solution for "Do second request after first is completed." is presented below. This pattern is not the best in the world but at least it will give you some code you can reference to.

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);
    }
});
Rzodkiewka
  • 410
  • 3
  • 8