Как выводить элементы из списка с задержкой в ​​RxJava?

Я использую Retrofit для получения закладок из REST API:

public interface BookmarkService {
    @GET("/bookmarks")
    Observable<List<Bookmark>> bookmarks();
}

Теперь я хотел бы выпустить каждый элемент из этого списка с задержкой.

Я сделал что-то похожее на это в Java, но onCompleted никогда не запускается.

private Observable<Bookmark> getBookmarks() {
    return getBookmarkService().bookmarks()
         .flatMap(new Func1<List<Bookmark>, Observable<Bookmark>>() {
            @Override
            public Observable<Bookmark> call(List<Bookmark> bookmarks) {
                Observable<Bookmark> resultObservable = Observable.never();
                for (int i = 0; i < bookmarks.size(); i++) {
                    List<Bookmark> chunk = bookmarks.subList(i, (i + 1));
                    resultObservable = resultObservable.mergeWith(Observable.from(chunk).delay(1000 * i, TimeUnit.MILLISECONDS));
                }

                return resultObservable;
            }
        })
        .observeOn(AndroidSchedulers.mainThread());
}

Что я делаю неправильно?

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

mSwipeRefreshLayout.setRefreshing(true);
getBookmarks()
    .subscribe(new Observer<Bookmark>() {
        @Override
        public void onCompleted() {
            Timber.i("Completed");
            mSwipeRefreshLayout.setRefreshing(false);
        }

        @Override
        public void onError(Throwable e) {
            Timber.i("Error: %s", e.toString());
            mSwipeRefreshLayout.setRefreshing(false);
        }

        @Override
        public void onNext(Bookmark bookmark) {
            Timber.i("Bookmark: %s", bookmark.toString());
            mBookmarksAdapter.addItem(bookmark);
        }
    });

person Ziem    schedule 27.01.2015    source источник


Ответы (1)


Когда вы используете операцию слияния, onCompleted будет вызываться, если все Observables будут завершены. но Observable.never() никогда не завершится. Вместо этого используйте Observable.empty().

Согласно вашему коду, вы хотите выпустить подсписок с задержкой. Подсписок содержит только один элемент

Что вы можете сделать: плоская карта вашего списка, чтобы выделять каждый элемент. Буферизируйте его, чтобы создать список из элементов, а затем используйте задержку.

private Observable<Bookmark> getBookmarks() {
    return getBookmarkService().bookmarks()
                               .flatMap((bookmarks) -> Observable.from(bookmarks)
      .buffer(1)
      .scan(new Pair(0, null), (ac, value) -> new Pair(acu.index + 1, value)
      .flatMap(pair -> Observable.just(pair.value).delay(pair.index, SECONDS)) 
                               .observeOn(AndroidSchedulers.mainThread());
}

может сработает (не проверял)

person dwursteisen    schedule 27.01.2015