使用RxJava处理分页
我在Android应用程序上使用Retrofit + RxJava,并问自己如何处理API分页以链接调用,直到检索到所有数据。是这样的:
Observable<ApiResponse> getResults(@Query("page") int page);
所述ApiResponse对象具有简单的结构:
class ApiResponse {
int current;
Integer next;
List<ResponseObject> results;
}
API将返回下一个值,直到最后一页。
有一些好的方法可以做到这一点吗?试图结合一些flatMaps(),但没有成功。
-
您可以递归建模:
Observable<ApiResponse> getPageAndNext(int page) { return getResults(page) .concatMap(new Func1<ApiResponse, Observable<ApiResponse>>() { @Override public Observable<ApiResponse> call(ApiResponse response) { // Terminal case. if (response.next == null) { return Observable.just(response); } return Observable.just(response) .concatWith(getPageAndNext(response.next)); } }); }
然后,要消耗它,
getPageAndNext(0) .concatMap(new Func1<ApiResponse, Observable<ResponseObject>>() { @Override public Observable<ResponseObject> call(ApiResponse response) { return Observable.from(response.results); } }) .subscribe(new Action1<ResponseObject>() { /** Do something with it */ });
那应该使您有一个流ResponseObject将按顺序到达,并且很可能以页面大小的块到达。