使用 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 中获取所有模型。
下面的代码是解释如何做到这一点的伪代码。
你的Response
class和Model
class可能是这样的:
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(...);
我知道这段代码不是尾递归调用。但我希望这会有所帮助。
我正在尝试发出 API 请求,要求我从服务器获取 model
中的所有数据。抓取不是问题,问题是有效载荷是用这样的东西分页的
"meta": {
"page": 1,
"perPage": 20,
"previousPage": false,
"nextPage": 2,
"pageCount": 2,
"total": 37
}
根据我的阅读,使用 RxJava
时的尾递归会使您的 Observables
变冷。这里的这个问题就是一个例子 RxJava
either. Then I came across this question RxJava With Interval and Flatmap。他利用了间隔。但是,interval 会告诉请求每隔 20Seconds
发出一次。我无法在请求上设置计时器,因为它可能更慢或更快。最好将其留给请求本身。所以,我的问题是如何实现需要分页的 Request
,就像第一个 Stack Question
一样。任何帮助,将不胜感激。我的代码库有点像第一个问题URL。
谢谢。
我不确定,但我猜你想从 observable 中获取所有模型。
下面的代码是解释如何做到这一点的伪代码。
你的Response
class和Model
class可能是这样的:
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(...);
我知道这段代码不是尾递归调用。但我希望这会有所帮助。