multiple api request using retrofit and rx java

前端 未结 3 476
情书的邮戳
情书的邮戳 2020-12-09 06:44

I am new to android and I have a scenario where I want to get get data from multiple api. Let suppose api_a, api_b, api_c,

相关标签:
3条回答
  • 2020-12-09 06:52

    There are at least 2 ways to achieve this -

    1) Using RxJava Zip operator (for parallel requests)

    Get all the observables

    Observable<ResponseType1> observable1 = retrofit.getApi_a();
    Observable<ResponseType2> observable2 = retrofit.getApi_b();
    Observable<ResponseType3> observable3 = retrofit.getApi_c();
    

    Zip the observables to get a final observable

    Observable<List<String>> result = 
    Observable.zip(observable1.subscribeOn(Schedulers.io()), observable2.subscribeOn(Schedulers
                .io()), observable3.subscribeOn(Schedulers.io()), new Function3<ResponseType1, ResponseType2, ResponseType3, List<String>>() {
        @Override
        public List<String> apply(ResponseType1 type1, ResponseType2 type2, ResponseType3 type3) {
            List<String> list = new ArrayList();
            list.add(type1.data);
            list.add(type2.data);
            list.add(type3.data);
            return list;
        }
    });
    

    now subscribe on the resultant observable

    result.observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(new Observer<List<String>>() {
                    @Override
                    public void onSubscribe(Disposable d) {
    
                    }
    
                    @Override
                    public void onNext(List<String> s) {
                        Log.d(TAG, "s is the list with all the data");
                    }
    
                    @Override
                    public void onError(Throwable e) {
                        Log.e(TAG, e.getMessage());
                    }
    
                    @Override
                    public void onComplete() {
    
                    }
                });
    

    2) Using RxJava flatMap() operator. (To request serially one after another)

    This is simple chaining of requests

        List<String> result = new ArrayList<>();
        Disposable disposable = retrofit.getApi_a()
                .subscribeOn(Schedulers.io())
                .flatMap((Function<ResponseType1, ObservableSource<ResponseType2>>) response1 -> {
                    result.add(response1.data);
                    return retrofit.getApi_b();
                })
                .flatMap((Function<ResponseType2, ObservableSource<ResponseType3>>) response2 -> {
                    result.add(response2.data);
                    return retrofit.getApi_c();
                })
                .map(response3 -> {
                    result.add(response3.data);
                    return response3;
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(new DisposableObserver<Response3>() {
    
                    @Override
                    public void onNext(Response3 response3) {
                        Log.d(TAG, "result variable will have all the data");
                    }
    
                    @Override
                    public void onError(Throwable e) {
                        Log.e(TAG, e.getMessage());
                    }
    
                    @Override
                    public void onComplete() {
    
                    }
                });
    
    0 讨论(0)
  • 2020-12-09 07:05

    Merge operator combines multiple observable into one

    Set up Base URL of API:

    Retrofit retrofit = new Retrofit.Builder()
                        .baseUrl(Constants.BASE_URL)
                        .addConverterFactory(GsonConverterFactory.create())
                        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                        .client(oktHttpClient.build())
                        .build();
    

    Now setup two observables for the two network requests:

    Observable<JsonElement> Observable1 = ApiClient.getApiService().getApi_1();
    
    Observable<JsonElement> Observable2 = ApiClient.getApiService().getApi_2();
    

    Now we use RxJava's mergemethod to combine our two Observables:

    Observable.merge(Observable1, Observable2 )
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<JsonElement>() {
                        @Override
                        public void onSubscribe(Disposable d) {
    
                        }
    
                        @Override
                        public void onNext(JsonElement value) {
                            Log.d("RESPONSE", "onNext:=======" + value);
                        }
    
                        @Override
                        public void onError(Throwable e) {
    
                        }
    
                        @Override
                        public void onComplete() {
                            Log.d("RESPONSE", "DONE==========");
                        }
                    });
    
    0 讨论(0)
  • 2020-12-09 07:13

    For combining multiple Observables you may want to consider the Merge operator. This would allow you to combine the stream of multiple requests into a single Observable.

    Merge will interleave them as they are emitted. If sequence matters, there is also Concat which will emit from each Observable before continuing with the next.

    Rx Doc

    • Merge: http://reactivex.io/documentation/operators/merge.html
    • Concat: http://reactivex.io/documentation/operators/concat.html
    0 讨论(0)
提交回复
热议问题