gpt4 book ai didi

java - 使用 RxJava 嵌套网络请求

转载 作者:太空宇宙 更新时间:2023-11-04 11:10:09 25 4
gpt4 key购买 nike

我对 RxJava 很陌生。我在将嵌套异步操作转换为 RxJava 结构时遇到问题。创建一个从服务器获取数据的异步任务并不是一个问题,但是我确实对这种示例案例有疑问:

List<A> aaa = new ArrayList<>();
List<B> bbb = new ArrayList<>();

new FetchItemA(String id){
@Override
protected void onPostExecute(List<A> items){
foreach(A item:items){
new FetchItemB(item.getId())
@Override
protected void onPostExecute(List<B> newItems){
neededList.addAll(newItems);
}
}
}
}

}

问题出在返回类型上。我以这种方式创建了我的可观察对象:

Observable.fromArray(String userId)
.map(new Function(String, List<A>){
@Override
public List<A> apply(String id){
return getListA();
}
})
.map(new Function<String, List<B>){
@Override
public List<B> apply(String id){
someList.add(getItemB(id));
return someList;
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer(){
@Override
public void onCompleted(List<B> items){
bbb.addAll(items);
adapter.setItems(bbb);
}
});

但是这是非法的,因为 Observable需要类型 List<A>而我正在返回List<B> 。如何构建我的 RxJava 可观察对象,以便能够获取项目列表(类型 A,每个项目都有一个唯一的 id),并根据获取的列表,获取单个项目(类型 B),其中 id(第一个列表中类型 A 的每个项目)作为参数,并且仅在将接收到的项目(类型 B)添加到列表之后?

最佳答案

获取数据的基本步骤是转换每个 A进入B使用网络调用。在 RxJava 世界中,这意味着将网络调用包装在可观察对象中,然后使用 flatMap()运算符。

Observable.fromList(aaa)
.flatMap(new Func1<A, Observable<B>>() {
@Override
public Observable<B> call(A a) {
return Observable.fromCallable(getNetworkValueAsB(item));
}
} )
.toList()
.subscribe( new Observer<List<B>>() {
@Override
public void onNext(B bItemList) {
bbb.addAll(bItemList);
adapter.setItems(bbb);
}
});

操作是 fromList()List<A> 转换而来至Observable<A> , flatMap()A 转换而来至B使用电话,以及 toList()它收集了所有 B值生成到列表中,然后在订阅中使用。

fromList()运算符可能被称为 fromIterable()from()取决于您使用的库的版本。

编辑以删除 lambda

关于java - 使用 RxJava 嵌套网络请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46112479/

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