2017-06-12 52 views
1

我正在使用REST API查詢Person對象列表。最大限度是100人的迴應。我需要取回所有人,總金額未知。 第一個響應中有一個名爲「next」的字段,其中包含下一頁的url。我需要使用RxJava/RxAndroid和Retrofit鏈接這些調用,直到最後一個響應有一個空的「下一個」字段。 由於「下一個」字段包含分頁網址,因此所有後續的調用將具有與第一個不同的網址。 什麼是最簡單的方法來做到這一點?android rxjava2/retrofit2使用分頁令牌鏈接調用

+0

您是否想要進行所有調用,然後返回(發出)一大羣人或加載人員作爲對某些操作的反應? – skywall

+0

一旦所有調用完成,我寧願有一個最後發出的人的大名單 –

+0

您可能會發現這個有用https://stackoverflow.com/questions/28047272/handle-paging-with-rxjava – skywall

回答

1

類似的東西,以這樣的工作(有點廣義):

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