2015-01-27 2 views
6

Я использую Дооснащение получить закладки из REST API:Как исправить элементы из списка с задержкой в ​​RxJava?

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

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

Я сделал что-то похожее на this на 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); 
     } 
    }); 

ответ

4

Как использовать операцию слияния, OnCompleted будет звонить, если все Наблюдаемые завершены. но 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()); 
} 

он может работать (не проверено)

+0

'Observable.empty()' решить мою проблему. – Ziem

Смежные вопросы