Обработка пейджинга с помощью RxJava

Я использую Retrofit + RxJava в приложении для Android и задаю себе вопрос о том, как обрабатывать разбиение на страницы API на цепочку вызовов до тех пор, пока все данные не будут восстановлены. Что-то вроде этого:

Observable getResults(@Query("page") int page); 

Объект ApiResponse имеет простую структуру:

 class ApiResponse { int current; Integer next; List results; } 

API вернет следующее значение до последней страницы.

Есть ли хороший способ добиться этого? Пытался объединить некоторые flatMaps () , но не имел успеха.

Вы можете моделировать его рекурсивно:

 Observable getPageAndNext(int page) { return getResults(page) .concatMap(new Func1>() { @Override public Observable 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>() { @Override public Observable call(ApiResponse response) { return Observable.from(response.results); } }) .subscribe(new Action1() { /** Do something with it */ }); 

Это должно дать вам stream ResponseObject , который поступит в порядок, и, скорее всего, придет в куски размера страницы.

Иопар дал отличный пример.

Просто небольшое дополнение.
Если вы хотите получить все страницы в одном вызове onNext ().
Это может быть полезно, если вы хотите закрепить этот результат еще одним наблюдаемым.
Вы должны написать:

 private List list = new LinkedList() { { add("a"); add("b"); add("c"); } }; int count = 1; public Observable> getAllStrings(int c) { return Observable.just(list) .concatMap( strings -> { if (c == 3) { return Observable.just(list); } else { count += 1; return Observable.zip( Observable.just(list), getAllStrings(count), (strings1, strings2) -> { strings1.addAll(strings2); return strings1; } ); } } ); } 

Использование :

 getAllStrings(0) .subscribe(strings -> { Log.w(TAG, "call: " + strings); }); 

и вы получите:

 call: [a, b, c, a, b, c, a, b, c, a, b, c] 

Я ответил на свое решение в аналогичной должности: https://stackoverflow.com/a/34378263/143733

Трюк или поправка к решению, предоставленному @Iopar, – это включение «триггера», наблюдаемого, которое может быть выбрано различными способами.

В опубликованном мной коде он выдается после того, как была обработана полная страница элементов, однако это также может происходить на основе щелчка пользователем кнопки / прокрутки.

  • shouldOverrideUrlLoading в WebView для Android не работает
  • Сделать фоновый рисунок кнопки Android при щелчке по XML
  • Android: как программно найти имя версии Android?
  • Символы Unicode, не отображаемые в TextView.setText
  • Mipmaps vs. drawable folders
  • Преобразование изображения в PDF в Android
  • Может ли Android Studio использоваться для запуска стандартных проектов Java?
  • Отображать fragment просмотра в fragmentе
  • В чем разница между системными приложениями и привилегированными приложениями на Android?
  • Где «createFromResourceId ()» go?
  • Размер подсказки для Android EditText
  • Давайте будем гением компьютера.