2017-07-17 45 views
1

我的RxJava callchain出現問題。 toList工作不正常。我想這是toList()需要完成的東西。這就是它被卡住的原因。但我不知道如何解決這個問題Rxjava tolist()未完成

代碼

 mModel.getLocations() 
      .flatMapIterable(new Function<List<Location>, List<Location>>(){ 
       @Override 
       public List<Location> apply(final List<Location> locations) throws Exception { 
        return locations; 
       } 
      }) 
      .filter(new Predicate<Location>() { 
       @Override 
       public boolean test(final Location location) throws Exception { 
        return location.searchExistInNameOrKeyWord(input); 
       } 
      }) 
      .toList() 
      .map(new Function<List<Location>, List<Location>>() { 
       @Override 
       public List<Location> apply(List<Location> locations) throws Exception {      
        /** Doing some random work with the list and then returning */ 
       } 
      }) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Consumer<List<Location>>() { 
       @Override 
       public void accept(final List<Location> locations) throws Exception { 
        mView.setAdapterItems(locations); 
       } 
      }); 

也許有人比我好很多,在RxJava可以查到我在做什麼錯。

更新

@Query("SELECT * from location") 
Flowable<List<Location>> loadAllLocations(); 

mModel.getLocations()只是調用上面一樣從房percistance存儲

+0

那麼,是'mModel.getLocations()'實際上完成? –

+0

在帖子中增加了更多信息。它唯一做的就是從存儲中調用loadAllLocations –

回答

6

我以前從來沒有使用房間的loadAllLocations但根據這篇文章:https://medium.com/google-developers/room-rxjava-acb0cd4f3757

現在,每當用戶數據更新時,我們的Flowable對象將會發出 發出自動,允許您根據最新的 數據更新UI。只有當查詢結果至少包含 行時,Flowable纔會發出。當沒有數據與查詢匹配時,Flowable 將不會發出,onNext和onError都不會發出。

所以,Flowable上的每個數據的變化做出反應,這意味着onComplete永遠不會被調用。在這種情況下,您不能使用toList()運算符,因爲此流永遠不會完成。

0

toList()運算符的關鍵點是它將等待所有項目被髮射。一旦完成意味着onComplete()方法必須被調用,那裏我們會得到我們期望的結果。如果我們沒有使用onComplete()或者由於某種原因onComplete()沒有被調用,那麼就不會打印任何東西。