使用RxJava处理分页

发布于 2021-01-30 17:56:44

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

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

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

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

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

有一些好的方法可以做到这一点吗?试图结合一些flatMaps(),但没有成功。

关注者
0
被浏览
839
1 个回答
  • 面试哥
    面试哥 2021-01-30
    为面试而生,有面试问题,就找面试哥。

    您可以递归建模:

    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将按顺序到达,并且很可能以页面大小的块到达。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看