Skip to content

Instantly share code, notes, and snippets.

@roana0229
Last active March 5, 2018 04:04
Show Gist options
  • Save roana0229/8deada9b480e6c1def65bd202608d64d to your computer and use it in GitHub Desktop.
Save roana0229/8deada9b480e6c1def65bd202608d64d to your computer and use it in GitHub Desktop.
RxJava再帰処理でページング式のエンドポイントを全件取得する方法案
private void main() { // このメソッドが最初に呼ばれるとして
Completable.create(new CompletableOnSubscribe() {
@Override
public void subscribe(CompletableEmitter emitter) throws Exception {
fetchAll(emitter, 20, 0);
}
});
}
// 適当な通信処理
private io.reactivex.Single<ListResults<Model>> fetchModel(int limit, int offset) {
return io.reactivex.Single.create(new SingleOnSubscribe<ListResults<Model>>() {
@Override
public void subscribe(SingleEmitter<ListResults<Model>> emitter) throws Exception {
...
}
});
}
// 再帰呼び出しして、全件取得したらemitterで通知
private void fetchAll(final CompletableEmitter emitter, int limit, int offset) {
fetchModel(limit, offset)
.subscribeWith(new DisposableSingleObserver<ListResults<Model>>() {
@Override
public void onSuccess(ListResults<Model> results) {
if (results.getTotalResults() > results.getStartIndex() + results.getItemsPerPages()) {
// まだ全部取得していない
fetchAll(emitter, 20, results.getStartIndex() + results.getItemsPerPages());
} else {
// 全部取得した
emitter.onComplete();
}
}
@Override
public void onError(Throwable e) {
emitter.onError(e);
}
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment