使用Retrofit和RX Java的多个API请求



我是安卓新手,我有一个场景,我想从多个 API 获取数据。假设api_a,api_b,api_c,api_d。这些 api 彼此独立,但我想在混合回收器视图(水平和垂直(中显示来自这些 api 的数据。因此,我想以这种方式进行这些 api 调用,以便我可以一次获取每个 api 数据,以便我可以在回收器视图中显示。 我已经使用了改造 2,但为此我不得不将它们一个接一个地链接起来,这非常冗长,我认为这不是一种可行的方法。我对RX JAVA知之甚少,但我一次只知道如何发出一个请求。请帮忙

至少有 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() {
}
});

要组合多个可观察量,您可能需要考虑合并运算符。这将允许您将多个请求流合并到单个可观察量中。

合并将在发出它们时交错它们。如果序列很重要,还有Concat,它将从每个可观察量发出,然后再继续下一个。

接收文档

  • 合并:http://reactivex.io/documentation/operators/merge.html
  • 康卡特:http://reactivex.io/documentation/operators/concat.html

合并运算符将多个可观察量合并为一个

设置 API 的基本 URL:

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

现在为两个网络请求设置两个可观察量:

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

现在我们使用 RxJava 的合并方法来组合我们的两个可观察量:

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

最新更新