由Retrofit和Rx重复请求

时间:2016-05-13 14:08:17

标签: android rx-java rx-android

我有按页面返回数据的API,如下所示:

{
   "count": 100,
   "offset": 0,
   "limit": 25,
   "result": [{}, {}, {}...]
}

我需要获取所有页面 - 所有数据(使用不同的“偏移量”:)执行查询。

      Observable<MyResponse> call = RetrofitProvider.get().create(MyApi.class).getData(0, 25); // limit and offset
    call.observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.newThread())
            .doOnNext(<saving data>)
            .subscribe(result -> {                   
            }, error -> {             
            });

我正在尝试使用RxAndroid和Retrofit。最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

您可以使用发布主题作为源可观察对象,然后继续动态地为下一个范围添加新请求。

private Observable<ApiResponse> getData(int start, int end) {
    // Get your API response value
    return RetrofitProvider.get().create(MyApi.class).getData(0, 25);
}

public Observable<ApiResponse> getAllData() {
    final PublishSubject<ApiResponse> subject = PublishSubject.create();
    return subject.doOnSubscribe(new Action0() {
        @Override
        public void call() {
            getData(0, SECTION_SIZE).subscribe(subject);
        }
    }).doOnNext(new Action1<ApiResponse>() {
        @Override
        public void call(ApiResponse apiResponse) {
            if (apiResponse.isFinalResultSet()) {
                subject.onCompleted();
            } else {
                int nextStartValue = apiResponse.getFinalValue() + 1;
                getData(nextStartValue, nextStartValue + SECTION_SIZE).subscribe(subject);
            }
        }
    });
}

答案 1 :(得分:0)

如果你知道计数是什么,你可以做类似

的事情
Observable<MyResponse> call = Observable.empty();
for (int i=0 ; i<count ; i+=25) { 
    call.concatWith(RetrofitProvider.get().create(MyApi.class).getData(i, i+25));
}