当前位置: 首页 > 面试题库 >

使用RxJava处理分页

皇甫喜
2023-03-14
问题内容

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



 类似资料:
  • 嗨,我是RxJava和Kotlin的新手,我对它有一些概念。 我知道错误是很明显的。所以我知道缺少了什么,但我不知道的是如何处理这个错误。 我尝试添加:,但仍显示相同的错误消息。

  • 我正在使用较新的RX java,而不是 如果一切正常的话,这段代码几乎可以完美地工作。但如果我故意犯了个错误,比如我关掉了WiFi。而不是改型获得“UnknownHostException”...因为它应该发生在try catch块中的reverfit调用(getUser)中。但它没有将错误处理到onError(Throwable t)-->(我可以处理的地方),而是使应用程序崩溃。这就像错误从未

  • 我正在尝试将一个向服务器发送消息的异步任务迁移到RxJava。该任务大致执行以下操作: 1) 创建将要发送的消息(保存到数据库) 2)向用户显示消息(状态为“发送”) 3)将消息发送到服务器(下面的代码段) 4)将消息标记为已发送或失败(保存到数据库) 5)更新UI 我创建了所需的Rx链,部分如下所示: 当我订阅上述内容时,我会得到一个一次性的。通常,我会将其添加到CompositeDisposa

  • 我目前正试图把精力放在RxJava上,但我在以优雅的方式处理服务调用异常方面遇到了一点麻烦。 基本上,我有一个(改型)服务,它返回一个。的定义如下: 现在,我想要的是将该泛型响应映射到data JsonElement字段中包含的(我假设您不关心对象的外观,所以我不会用它污染文章)。下面的代码对于success案例非常有效,但是我找不到一个很好的方法来处理我的API异常: 有没有更好的办法做到这一点

  • 我正在实现spring批处理作业,用于使用分区方法处理一个DB表中的数百万条记录,如下所示- > 从分区器中的表中提取唯一的分区代码,并在执行上下文中设置相同的代码。 创建一个包含读取器、处理器和写入器的块步骤,以基于特定分区代码处理记录。 是否可以创建分区/线程来处理像thread1进程1-1000,thread2进程1001-2000等? 如何控制创建的线程数,因为分区代码可以是100个左右,

  • 我有3个EditText字段,我为这些字段创建了3个可观察对象。 当这三个字段都有值时,我想启用一个按钮。用户可以在字段中按任意顺序输入值。我该怎么做? 我用zip实现了这一点。 当我在所有三个文本字段中输入某个内容时,上面的这种情况就会起作用。e、 g.我在所有三个文本字段中输入了1个字符,然后按钮将被启用。但当我删除这三个字段中的任何一个字符时。zip不会被调用,因为它将等待其他2个文本字段流