使用Retrofit2和RxJava获取Paginating URL

时间:2016-08-09 07:05:01

标签: rx-java retrofit2 rx-android

我正在尝试发出API请求,要求我从服务器获取model中的所有数据。提取不是问题,事实上有效负载是用这样的东西进行分页的 "meta": { "page": 1, "perPage": 20, "previousPage": false, "nextPage": 2, "pageCount": 2, "total": 37 } 根据我的阅读,使用RxJava时的尾递归会使你的Observables变冷。一个例子就是这里的问题StackOverFlow Question他正根据评论调整多个观察者。我对RxJava也不太了解。然后我遇到了这个问题RxJava With Interval and Flatmap。他利用了Interval。但是,间隔会告诉请求每20Seconds我无法在请求上设置计时器,因为它可能更慢或更快。最好将它留给请求本身。所以,我的问题是我如何实现一个需要分页的Request,就像第一个Stack Question一样。任何帮助,将不胜感激。我的代码库有点像第一个问题URL。 感谢。

1 个答案:

答案 0 :(得分:0)

我不确定,但我想您希望从可观察的角度获得所有模型。

下面的代码是伪代码,用于解释如何执行此操作。

您的Response班级和Model班级可能是这样的:

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(...);

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