gpt4 book ai didi

rx-java - 如何使用 RxJava 处理分页?

转载 作者:行者123 更新时间:2023-12-03 14:11:00 24 4
gpt4 key购买 nike

我正在考虑将我的 android 应用程序转换为使用 Rxjava 进行网络请求。我目前访问的网络服务类似于:

getUsersByKeyword(String query, int limit, int offset)

据我了解,Observables 是一个“推”而不是“拉”接口(interface)。所以这就是我如何理解要解决的问题:
  • 应用注册服务,获取 Observable 用于查询
  • 结果推送到应用
  • 应用程序处理结果
  • 当应用程序想要更多结果时......?

  • 这就是我崩溃的地方。以前我只会向网络服务询问我想要的内容,然后使用偏移量再次进行查询。但在这种情况下,这将涉及创建另一个 Observable 并订阅它,有点违背了这一点。

    我应该如何处理我的应用程序中的分页? (这是一个 android 应用程序,但我认为这无关紧要)。

    最佳答案

    这是硬摇滚!)
    所以我们有网络请求:getUsersByKeyword(String query, int limit, int offset) 例如,此请求返回 List< Result > 如果我们使用 RetroFit 进行联网,该请求将如下所示:Observable< List< Result >> getUsersByKeyword(String query, int limit, int offset) 结果我们想要得到所有Result从服务器。
    所以它看起来像这样

    int page = 50;
    int limit = page;
    Observable
    .range(0, Integer.MAX_VALUE - 1)
    .concatMap(new Func1<Integer, Observable<List<Result>>>() {
    @Override
    public Observable<List<Result>> call(Integer integer) {
    return getUsersByKeyword(query, integer * page, limit);
    }
    })
    .takeWhile(new Func1<List<Result>, Boolean>() {
    @Override
    public Boolean call(List<Result> results) {
    return !results.isEmpty();
    }
    })
    .scan(new Func2< List<Result>, List<Result>, List<Result>>() {
    @Override
    public List<Result> call(List<Result> results, List< Result> results2) {
    List<Result> list = new ArrayList<>();
    list.addAll(results);
    list.addAll(results2);
    return list;
    }
    })
    .last()
    .subscribe(new Subscriber<List<Result>>() {
    @Override
    public void onCompleted() {
    }

    @Override
    public void onError(Throwable e) {

    }

    @Override
    public void onNext(List<Results> results) {
    }
    });

    代码已测试!

    关于rx-java - 如何使用 RxJava 处理分页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26321023/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com