用RxJava处理分页

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (109)

我在Android应用程序上使用Retrofit + RxJava,并且询问自己如何处理API分页来链接调用,直到检索到所有数据。是这样的:

Observable<ApiResponse> getResults(@Query("page") int page);

所述ApiResponse对象具有简单的结构:

class ApiResponse {
    int current;
    Integer next;
    List<ResponseObject> results;
}

该API将返回下一个值,直到最后一页。

有一些很好的方法来实现这一目标?我试图结合一些flatMaps(),但没有成功。

提问于
用户回答回答于

你可以递归地建模:

Observable<ApiResponse> getPageAndNext(int page) {
  return getResults(page)
      .concatMap(new Func1<ApiResponse, Observable<ApiResponse>>() {

        @Override
        public Observable<ApiResponse> call(ApiResponse response) {
          // Terminal case.
          if (response.next == null) {
            return Observable.just(response);
          }
          return Observable.just(response)
              .concatWith(getPageAndNext(response.next));
        }

      });
}

那么,要消耗它,

getPageAndNext(0)
    .concatMap(new Func1<ApiResponse, Observable<ResponseObject>>() {

        @Override
        public Observable<ResponseObject> call(ApiResponse response) {
          return Observable.from(response.results);
        }

    })
    .subscribe(new Action1<ResponseObject>() { /** Do something with it */ });

这应该ResponseObject会给你一个顺序到达的流,最有可能达到页面大小的块。

扫码关注云+社区

领取腾讯云代金券