如何使用 RxJava 处理分页? [英] How to handle paging with RxJava?

查看:37
本文介绍了如何使用 RxJava 处理分页?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm looking into converting my android app to use Rxjava for network requests. I currently access a webservice similar to:

getUsersByKeyword(String query, int limit, int offset)

据我所知,Observables 是一个推"而不是拉"接口.所以我是这样理解要解决的问题的:

As I understand it, Observables are a "push" rather than a "pull" interface. So here's how I understand things to work out:

  • 应用向服务注册,获取 Observable 以供查询
  • 结果被推送到应用
  • 应用处理结果
  • 当应用想要更多结果时......?

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

This is where things break down for me. Previously I would just ask the webservice for exactly what I want, make the query again with the offset. But in this case that would involve creating another Observable and subscribing to it, kind of defeating the point.

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

How should I handle paging in my app? (It's an android app, but I don't think that is relevant).

推荐答案

太难了!)所以我们有网络请求:
getUsersByKeyword(String query, int limit, int offset)
这个请求返回例如
<代码> 列表<结果>
如果我们使用 RetroFit 进行网络连接,该请求将如下所示:
可观察的<列表<结果>> getUsersByKeyword(String query, int limit, int offset)
因此,我们希望从服务器获取所有 Result.
所以它看起来像这样

It was hard rock!) So we have request to network:
getUsersByKeyword(String query, int limit, int offset)
and this request return for example
List< Result >
If we use RetroFit for networking that request will look:
Observable< List< Result >> getUsersByKeyword(String query, int limit, int offset)
As result we want to get all Result from server.
So it will look like this

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) {
                    }
                });

代码已经过测试!

这篇关于如何使用 RxJava 处理分页?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆