我正在尝试发出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。
感谢。
答案 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(...);
我知道这段代码不是尾递归调用。但我希望这会有所帮助。