web-dev-qa-db-ja.com

レトロフィットとrxを使用した複数のAPIリクエストjava

私はAndroidを初めて使用し、複数のAPIからデータを取得したいというシナリオがあります。api_aapi_bapi_capi_d。これらのAPIは互いに独立していますが、これらのAPIからのデータを混合リサイクラービューで表示したい(水平および垂直 )したがって、これらのAPI呼び出しをこのような方法で行い、一度にすべてのAPIデータを取得して、リサイクラービューで表示できるようにします。既にretrofit 2を使用していますが、そのために非常に長い1つずつそれらをチェーンする必要があり、これは実現可能なアプローチではないと思います。私はRX Javaについて少し知っていますが、一度に1つの要求を行う方法しか知りません。助けて

7
Android

これを達成するには少なくとも2つの方法があります-

1)RxJava Zip演算子の使用(並列リクエストの場合)

すべてのオブザーバブルを取得

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

オブザーバブルを圧縮して最終オブザーバブルを取得する

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

結果のオブザーバブルをサブスクライブします

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)RxJava flatMap()演算子を使用します。(次々とシリアルにリクエストするため)

これはリクエストの単純なチェーンです

    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() {

                }
            });
13
Ankit Aggarwal

マージ演算子は複数のオブザーバブルを1つに結合します

APIのベースURLを設定します。

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

次に、2つのネットワーク要求に対して2つのオブザーバブルをセットアップします。

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

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

次に、RxJavaのmergemethodを使用して、2つのObservableを結合します。

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
Sayan Manna

複数のオブザーバブルを組み合わせる場合は、Merge演算子を検討してください。これにより、複数のリクエストのストリームを1つのObservableに結合できます。

Mergeはそれらが放出されるときにそれらをインターリーブします。シーケンスが重要な場合は、Concatもあり、各Observableから発行されてから、次のObservableに進みます。

Rx Doc

0
Shazbot