繁体   English   中英

带有分页令牌的android rxjava2 / retrofit2链接调用

[英]android rxjava2/retrofit2 chaining calls with pagination token

我正在使用REST API查询Person对象的列表。 最多可容纳100人。 我需要提取所有人,总数未知。 第一个响应中有一个名为“ next”的字段,其中包含下一页的url。 我需要使用RxJava / RxAndroid和Retrofit链接这些调用,直到最后一个响应具有空的“ next”字段。 由于“下一个”字段包含分页网址,因此所有后续调用将具有与第一个不同的URL。 最方便的方法是什么?

与此类似的东西可能会起作用(有点笼统):

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

你可以做这样的事情。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM