我对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 observable以便能够获取项目列表(类型A,每个都具有唯一的id),并基于获取的列表,获取具有id(每个项目)的单个项目(类型B)在第一个列表中的类型A)作为参数,并且只有在将收到的项目(类型B)添加到列表中之后?
答案 0 :(得分:0)
获取数据的关键步骤是使用网络调用将每个B
转换为flatMap()
。在RxJava世界中,这意味着将网络调用包装在一个observable中,然后使用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()
或canvas.creat_image
,具体取决于您使用的库的版本。
编辑删除了lambdas