使用 Retrofit2 和 RxJava 获取分页 URL

Fetching A Paginating URL with Retrofit2 and RxJava

我正在尝试发出 API 请求,要求我从服务器获取 model 中的所有数据。抓取不是问题,问题是有效载荷是用这样的东西分页的 "meta": { "page": 1, "perPage": 20, "previousPage": false, "nextPage": 2, "pageCount": 2, "total": 37 } 根据我的阅读,使用 RxJava 时的尾递归会使您的 Observables 变冷。这里的这个问题就是一个例子 he's is spuning multiple Observers based on the comments. I don't know much about RxJava either. Then I came across this question RxJava With Interval and Flatmap。他利用了间隔。但是,interval 会告诉请求每隔 20Seconds 发出一次。我无法在请求上设置计时器,因为它可能更慢或更快。最好将其留给请求本身。所以,我的问题是如何实现需要分页的 Request,就像第一个 Stack Question 一样。任何帮助,将不胜感激。我的代码库有点像第一个问题URL。 谢谢。

我不确定,但我猜你想从 observable 中获取所有模型。

下面的代码是解释如何做到这一点的伪代码。

你的Responseclass和Modelclass可能是这样的:

public class Response {
    Meta meta;
    List<Model> models;
}

public class Model {
    ...
}

public class Meta {
    int page;
    int perPage;
    boolean previousPage;
    int nextPage;
    int pageCount;
    int total;
}

创建 Observable.OnSubscribe 请求和发出所有模型。 像这样:

public Observable<List<Model>> getAllModels(ApiService apiService) {
    return Observable.create(new Observable.OnSubscribe<Model>() {

        @Override
        public void call(Subscriber<? super Model> subscriber) {
            try {

                final int perPage = 20;

                for (int page = 1, pageCount = 1; page <= pageCount; page++) {
                    Call<Response> call = apiService.getModels(page, perPage);
                    Response response = call.execute().body();
                    subscriber.onNext(response.models);

                    pageCount = response.meta.pageCount;
                }

                subscriber.onCompleted();

            } catch (IOException e) {
                subscriber.onError(e);
            }
        }
    });
}

调用上面的方法。像这样:

ApiService apiService = retrofit.create(ApiService.class);

getAllModels(apiService)
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(...);

我知道这段代码不是尾递归调用。但我希望这会有所帮助。