android rxjava2 / retrofit2使用分页标记链接调用

时间:2017-06-12 22:37:46

标签: android pagination retrofit rx-android rx-java2

我使用REST API查询Person对象列表。最大限制为100人响应。我需要抓取所有人,总金额未知。 第一个响应中有一个字段叫做" next",包含下一页的url。我需要使用RxJava / RxAndroid和Retrofit链接这些调用,直到最后一个响应为空" next"领域。 自从" next"字段包含分页URL,所有后续调用将具有与第一个不同的URL。 最方便的方法是什么?

2 个答案:

答案 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);