我正在对rxAndroid进行改造,试图从服务器获取响应,直到服务器返回0列表大小。
getPageAndNext(rows_id),现在将其接受起始点ID考虑为0,在下一个请求中,我将传递第9个ID,以便服务器在第9个ID响应后返回。(10th,11th,... 15th ... 19th )
Observable<List<Feed>> getPageAndNext(int id) {
return apiInterface.postGetFeed(membersIds, id)
.flatMap(feedResponse -> {
if (feedResponse.getData().size() > 0) {
return Observable.just(feedResponse.getData())
.concatWith(getPageAndNext(feedResponse.getData().get(feedResponse.getData().size() - 1).getId()));
}
return Observer::onComplete;
});
}
在每个请求中,我得到10个提要,并通过onNext方法将提要插入房间数据库中
getPageAndNext(0)
.subscribeOn(Schedulers.computation())
.subscribe(new DisposableObserver<List<Feed>>() {
@Override
public void onNext(List<Feed> feeds) {
//save to room database
memberDatabaseRepository.insertMemberList(feeds);
}
@Override
public void onError(Throwable e) {
Log.e("jjjj", "error"+e);
}
@Override
public void onComplete() {
Log.d("kkkk","done");
}
});
现在,我没有从服务器获得所有响应。我正在搜索过去24小时,但没有任何解决方法。
注意:我能够执行76个API调用,但是即使房间数据库中仅保存了76个API调用数据,也没有任何响应。但大约有630个API调用
链接:-
How To Do Recursive Observable Call in RxJava?
How to ignore error and continue infinite stream?
RxJava takeUntil with emmision of last item?
How to make multiple requests with reactive android and retrofit
答案 0 :(得分:0)
最后,我解决了rxAndroid中的递归调用API。
takeUntil
->我正在检查大小是否为零,然后停止递归调用。
Observable.range(0, Integer.MAX_VALUE)
// Get each page in order.
.concatMap(integer -> {
return apiInterface.postGetFeed(membersIds, lastFeedId);
})
// Take every result up to and including the one where the next page index is null.
.takeUntil(result -> {
if(!result.getData().isEmpty())
lastFeedId = result.getData().get(result.getData().size() - 1).getId();
return result.getData().isEmpty();
})
.map(FeedResponse::getData)
.subscribeOn(Schedulers.io())
.subscribe(new DisposableObserver<List<Feed>>() {
@Override
public void onNext(List<Feed> feeds) {
Log.d("kkkk", "" + feeds);
memberDatabaseRepository.insertMemberList(feeds, lastFeedId);
}
@Override
public void onError(Throwable e) {
Log.d("kkkk", "error " + e.getMessage());
}
@Override
public void onComplete() {
Log.d("kkkk", "onComplete");
memberDatabaseRepository.getAllFeed(FeedFragment.this);
}
}
);