gpt4 book ai didi

android - 使用改造和 rx java 的多个 api 请求

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:07:30 26 4
gpt4 key购买 nike

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

最佳答案

至少有两种方法可以实现这一点-

1) 使用 RxJava Zip 运算符(用于并行请求)

获取所有可观察值

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

压缩 observable 以获得最终的 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;
}
});

现在订阅生成的可观察对象

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() operator.(一个接一个地请求)

这是简单的请求链

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

}
});

关于android - 使用改造和 rx java 的多个 api 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51112602/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com