使用翻新和Rx Java的多个API请求 [英] multiple api request using retrofit and rx java
问题描述
我是android的新手,我有一种情况,我想从多个api获取数据.假设 api_a , api_b , api_c , api_d .这些api彼此独立,但我想在Recycler View混合视图(水平和垂直)中显示这些api的数据.因此,我想以这种方式进行这些api调用,以便一次可以获取每个api数据,以便可以在回收站视图中显示. 我已经在使用 retrofit 2 ,但是为此我不得不将它们一个个地链接起来,这很长,我认为这不是可行的方法.我对 RX JAVA 知之甚少,但我只知道一次一次发出一个请求.请帮助
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, api_d. These api are independent of each other but I want to show data from these api in a mix Recycler View (horizontal and vertical). So I want to make these api call in such a manner so that I can get every api data at a time so that i can display in recycler view. I already using retrofit 2 but for that I had to chain them one by one which is very lengthy and I think this is not a feasible approach. I know little bit about RX JAVA ,but I only know how to make one request at a time. Please help
推荐答案
至少有两种方法可以实现-
There are at least 2 ways to achieve this -
1)使用RxJava Zip运算符(用于并行请求)
获取所有可观察物
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)使用RxJava flatMap()运算符.(一个接一个地连续请求)
2) Using RxJava flatMap() operator. (To request serially one after another)
这是简单的请求链接
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() {
}
});
这篇关于使用翻新和Rx Java的多个API请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!