当前位置: 首页 > 知识库问答 >
问题:

Android RXJava2改版处理分页

华景明
2023-03-14
public Observable<WatchList> syncWatchlistSection(String accountId) {
    String sessionToken = mLocal.getSessionId();
    int page = 1;

    return getWatchlistFromServerHelper(sessionToken, accountId, page).concatMap(new Function<WatchList, ObservableSource<? extends WatchList>>() {
        @Override
        public ObservableSource<? extends WatchList> apply(WatchList watchList) throws Exception {
            return Observable.fromArray(watchList);
        }
    });

}
private Observable<WatchList> getWatchlistFromServerHelper(String sessionToken, String accountId, int page) {
        return mRestAPI.fetchWatchlistOnServer(sessionToken, accountId, page).concatMap(new Function<WatchList, Observable<WatchList>>() {
            @Override
            public Observable<WatchList> apply(WatchList watchList) throws Exception {
                if (watchList.getPage() == watchList.getTotalPages()) {
                    return Observable.just(watchList);
                }
                return Observable.just(watchList).concatWith(getWatchlistFromServerHelper(sessionToken, accountId, page + 1));
            }
        });
    }
mSectionLogic.syncWatchlistSection(String.valueOf(account.getId()))
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe(new Observer<WatchList>() {
              ... so on ...
{
  page: 1,
  totalPages: 5,
  results: []
}

我做错了什么?我如何将结果与可观察的结果结合起来?最好不是用Lamda符号。

我查看的其他资源:-android rxjava2/retrofit2链接调用与分页令牌

共有1个答案

范承教
2023-03-14

你需要建立可观察的。您可以使用递归,但是如果您有大量的页,您的调用堆栈可能会溢出。在这里看到答案

类似于

private Observable<WatchList> getWatchlistFromServerHelper(String sessionToken, String accountId, int startPage) {
    int index = startPage;
    BehaviorSubject<Integer> pagecontrol = BehaviorSubject.create(startPage);
    Observable<WatchList> ret = pageControl.asObservable()
                                           .concatMap(new Function<Integer,Observable<WatchList>>()
                                                     {
                                                       Observable<WatchList> apply(Integer page) {
                                                            mRestAPI.fetchWatchlistOnServer(sessionToken, accountId, page)
                                                                    .doOnNext(new Function<watchList -> 
                                                                            (watchList.getPage() == watchList.getTotalPages() ? 
                                                                             Observable.<WatchList>empty().doOnCompleted(()->pageControl.onCompleted()) :
                                                                             pageControl.onNext(page+1)));
                                                        }
                                                     }
                                                     );
    return ret;
}

应该管用。

 类似资料:
  • 这里所说的分页,指的是大量数据显示时,每页显示固定的数量的数据,同时显示多个分页链接,用户点击翻页链接或页码时进入到对应的网页。 分页算法中需要处理的问题: (1)当前数据一共有多少条。 (2)每页多少条,算出总页数。 (3)根据总页数情况,处理翻页链接。 (4)对页面上传入的 Get 或 Post 数据,需要从翻页链接中继续向后传。 (5)在页面显示时,根据每页数量和当前传入的页码,设置查询的

  • 问题内容: 我正在创建一个RESTful Web服务(在Golang中),该服务从数据库中提取一组行并将其返回给客户端(智能手机应用程序或Web应用程序)。该服务需要能够提供分页。唯一的问题是,此数据在定期更改的“计算”列上排序(例如,网站上某内容的“竖起大拇指”或“竖起大拇指”的数量),因此 行可以在在客户的要求之间 。 我看了一些PostgreSQL功能,可以潜在地用来帮助我解决这个问题,但是

  • Java Checkstyle插件刚刚更新到6.0版本(Java8支持)。看来gradle用的是旧版本。我如何升级gradle checkstyle插件到更新的版本?

  • 问题内容: 我们有一个Hadoop集群,我们在上面存储使用Kryo(序列化框架)序列化为字节的数据。我们用于此目的的Kryo版本是从2.21正式版本派生而来的,以将我们自己的补丁应用于我们使用Kryo遇到的问题。当前的Kryo版本2.22也解决了这些问题,但是具有不同的解决方案。结果,我们不能仅仅更改我们使用的Kryo版本,因为这意味着我们将不再能够读取已经存储在Hadoop集群中的数据。为了解决

  • 本文向大家介绍jQuery插件版本冲突的处理方法分析,包括了jQuery插件版本冲突的处理方法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了jQuery插件版本冲突的处理方法。分享给大家供大家参考,具体如下: jQuery 的某个插件 当有多个版本同时可能会有冲突,导致代码错误 参考typeahead的处理方法,可以在插件中增加noconflict 方法来解决这个问题(在进入版本的时

  • 问题内容: 我在Android应用程序上使用Retrofit + RxJava,并问自己如何处理API分页以链接调用,直到检索到所有数据。是这样的: 所述ApiResponse对象具有简单的结构: API将返回下一个值,直到最后一页。 有一些好的方法可以做到这一点吗?试图结合一些flatMaps(),但没有成功。 问题答案: 您可以递归建模: 然后,要消耗它, 那应该使您有一个流ResponseO