gpt4 book ai didi

android - RxJava flatMapIterable 与 concatMap

转载 作者:搜寻专家 更新时间:2023-11-01 08:28:51 29 4
gpt4 key购买 nike

我有 2 个 retrofit 电话需要进行 A 和 B:

(A):返回一个ArrayList

(B):获取 (A) 的结果,它是一个 ArrayList。 (B) 遍历 ArrayList 并使用每个进行改造调用,并将结果数据组合到最终的 ArrayList 中,该 ArrayList 被发送到我的订阅者 onNext()

我能够让它与 flatmap 一起工作,但解决方案不是很优雅。据我了解,更好的解决方案是将 flatMapIterable 与 concatMap 一起使用,但我似乎无法采用我正在为 flatMapIterable 与 concatMap 所做的工作。

ServiceFactory.createRetrofitService().getUserFollowing(sessionMgr.getAuthToken())
.flatMap(new Func1<UserSelfFollows, Observable<? extends ArrayList<Media.MediaData>>>() {
@Override
public Observable<? extends ArrayList<Media.MediaData>> call(UserSelfFollows userSelfFollows) {

//make second requests based on response from First request to get all Users
ArrayList<Media.MediaData> arAllMedia = new ArrayList<>();
for(UserSelfFollows.UserDataFollows user : userSelfFollows.userdata){

Response <ResponseBody> response ;
Call <ResponseBody> call;
try {
call = ServiceFactory.createRetrofitService().getMediaOfUser(user.id,sessionMgr.getAuthToken());
response = call.execute();
}catch(IOException ex){
return Observable.error(ex);
}

if (response.isSuccessful()) {

try {
String str = responseHelper.streamToString( response.body().byteStream());
Gson gson = new GsonBuilder().create();
Media media = gson.fromJson(str, Media.class);

arAllMedia.addAll(media.mediaData);

} catch (IOException e) {
return Observable.error(e);
}
} else {
return Observable.error( new Exception( responseHelper.getErrorString( response.errorBody().byteStream())) );
}
}
return Observable.just(arAllMedia);

}
})
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<ArrayList<Media.MediaData>>() {
@Override
public final void onCompleted() {

}

@Override
public final void onError(Throwable e) {

}

@Override
public final void onNext(ArrayList<Media.MediaData> arMedia) {

}
})

这是我目前拥有的,但无法编译:

ServiceFactory.createRetrofitService().getUserFollowing(sessionMgr.getAuthToken())
.flatMapIterable(new Func1<UserSelfFollows, Iterable<?>>() {
@Override
public Iterable<?> call(UserSelfFollows userSelfFollows) {
return userSelfFollows.userdata;
}
})
.<Media.MediaData>flatMap(new Func1<UserSelfFollows.UserDataFollows, Observable<Media.MediaData>>() {
@Override
public Observable<Media.MediaData> call(UserSelfFollows.UserDataFollows user) {
return ServiceFactory.createRetrofitService().getMediaOfUser(user.id, sessionMgr.getAuthToken());
}
})
.toList();

错误是:

enter image description here

最佳答案

如果我理解正确你的场景你可以使用flatMapIterable,然后是flatMap操作符,最后用toList收集所有改造调用结果>.
在第一个 flatMapIterable 中,您将从第一次调用 (getUserFollowing()) 获得的 UserDataFollows 列表扁平化为发出多个项目的 Obsevrable从这个列表中,然后 flatMap 创建一个 Observable 对每个 UserSelfFollows.UserDataFollows 数据对象进行改造调用,(它将并行发生在这里似乎更适合,但如果您对顺序执行感兴趣,也可以使用 concatMap),然后将所有最终数据收集在一起,作为 MediaData 对象的列表,您可以使用 toList

ServiceFactory.createRetrofitService().getUserFollowing(sessionMgr.getAuthToken())
.flatMapIterable(new Func1<UserSelfFollows, Iterable<?>>() {
@Override
public Iterable<?> call(UserSelfFollows userSelfFollows) {
return userSelfFollows.userdata;
}
})
.flatMap(new Func1<UserSelfFollows, Observable<Media>>() {
@Override
public Observable<Media> call(UserSelfFollows user) {
return ServiceFactory.createRetrofitService().getMediaOfUser(user.id, sessionMgr.getAuthToken());
}
})
.toList()
.subscribe(new Action1<List<Media>>() {
@Override
public void call(List<Media> rs) {
//do something with the list of media data
}
});

关于android - RxJava flatMapIterable 与 concatMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42268452/

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