結果我有2個改造調用多個呼叫我需要做一個& B:RxJava flatmap:如何使基於從第一個電話
(A):返回一個ArrayList
(B):獲取(A)的結果是一個ArrayList。 (B)遍歷ArrayList並使用每個ArrayList進行翻新調用,並將生成的數據組合到最終ArrayList中,該ArrayList發送給我的訂閱者onNext()
我無法獲取正確的語法.... for例如我試圖返回arAllMedia,但是我下面的代碼期望我返回一個Observable。
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) {
}
})
採用Maxim建議下面我有以下,但它不會編譯:
ServiceFactory.createRetrofitService().getUserFollowing(sessionMgr.getAuthToken())
.flatMapIterable(new Func1<UserSelfFollows, Iterable<?>>() {
@Override
public Iterable<?> call(UserSelfFollows userSelfFollows) {
return userSelfFollows.userdata;
}
})
.concatMap(new Func1<UserSelfFollows.UserDataFollows, Observable<Media.MediaData>>() {
@Override
public Observable<Media.MediaData> call(UserSelfFollows.UserDataFollows user) {
return ServiceFactory.createRetrofitService().getMediaOfUser(user.id,sessionMgr.getAuthToken());
}
});
我確實得到它的工作,我編輯了上面的答案,以顯示我正在實現什麼,但似乎我的循環可能會更優雅地完成。您可以使用我的代碼在上面應用您的建議嗎? – Mike6679
我已更新我的答案,其餘實施由您決定 –
謝謝,但我不能應用您的建議,並且實際上沒有關於如何操作的示例。 – Mike6679