我使用REST API查询Person对象列表。最大限制为100人响应。我需要抓取所有人,总金额未知。 第一个响应中有一个字段叫做" next",包含下一页的url。我需要使用RxJava / RxAndroid和Retrofit链接这些调用,直到最后一个响应为空" next"领域。 自从" next"字段包含分页URL,所有后续调用将具有与第一个不同的URL。 最方便的方法是什么?
答案 0 :(得分:2)
类似于此的东西会起作用(有点概括):
public Observable<Response> paginate(String initialUrl){
AtomicReference<String> url = new AtomicReference<>(initialUrl)
return Observable.defer(() -> api.loadUsers(url.get())
.doOnNext(response -> url.set(response.next))
.repeatWhen(r -> r.takeWhile(!url.get().isEmpty()));
}
答案 1 :(得分:0)
你可以这样做。
Observable.just("input as one item if any").
.map(new Function<String, List<Person>>(){
@Override
public List<Person> apply(String inPut) throws Exception {
// using inPut, get url, service name, and other input
// params
String nextUrl = "firsturl";
List<Person> persons = new ArrayList<Persons>();
while(nextUrl != null){
//call service using plain retrofit passing nextUrl and get
//person objects
//add 100 person objects from each call
persons.add();
//get next Url
if(nextUrlFromResponse != null){
nextUrl = "next url from previous call";
}else{
nextUrl = null;
}
}
return persons;
}
}).subscribeOn(Schedulers.io()).observeOn(Androidmainthread);