Android RXJava2 Retrofit处理分页

By simon at 2018-02-07 • 0人收藏 • 35人看过

我遇到了使用RXJava2处理分页的问题。我试图按照这个[后 从SO](https://stackoverflow.com/questions/28047272 /手柄寻呼与 - rxjava)但是过期了。我希望得到一个更新的答案。我 使用Retrofit,我试图到第三方API页面,直到我所有的 结果。回应是低于,但我非常想通过所有页面和结合所有结果。 目前我的代码如下:

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

}
并在同一个文件的帮助文件类似于以前SO帖子。
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 ...
这工作,但不处理分页。钍e响应看起来像这样:
{
  page: 1,
  totalPages: 5,
  results: []
}
我所做的是当page == totalPages时应该返回。除此之外 结合起来e以前的结果,只是返回结果的最后一页。 mRestAPI.fetchWatchlistOnServer是Retrofit2获取请求回报 Observable<Watchlist>。 我究竟做错了什么?如何将结果与Observable结合?最好 不是在Lamda符号。 其他我看了资源:\ [android rxjava2 / retrofit2链接调用 分页标记](https://stackoverflow.com/questions/44509728 / android- rxjava2-retrofit2链式通话与 - 分页令牌)

1 个回复 | 最后更新于 2018-02-07
2018-02-07   #1

你需要建立Observable。你可以使用递归,但如果你有大 您的调用堆栈可能溢出的页数。看到答案 [这里](https://stackoverflow.com/questions/41498293/rxjava-and-cursor-based- 宁静-分页/ 41524537) Someth喜欢

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;
}
应该管用。

登录后方可回帖

Loading...