2017-07-17 15 views
1

RxJavaコールチェーンに問題があります。 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()はちょうど私が前にルームを使用していないが、この記事によると決してしまし

+0

実際、 'mModel.getLocations()'は実際に完了していますか? –

+0

が投稿にさらに詳しい情報を追加しました。それが行う唯一のことは、ストレージからloadAllLocationsを呼び出すことです –

答えて

6

ルームpercistanceストレージから上記のようなloadAllLocationsを呼び出します。https://medium.com/google-developers/room-rxjava-acb0cd4f3757

今、ユーザーデータが更新されるたびに、Flowableオブジェクトは emit自動的に最新の データに基づいてUIを更新することができます。 Flowableは、クエリ結果に少なくとも の行が含まれている場合にのみ発生します。クエリに一致するデータがない場合、Flowable はonNextもonErrorも放出しません。

したがって、Flowableはすべてのデータ変更に対して反応します。つまり、onCompleteは決して呼び出されません。その場合、toList()演算子は使用できません。このストリームは決して完了しないためです。

0

toList()演算子のキーポイントは、すべてのアイテムが放出されるのを待つことです。いったん完了したonComplete()メソッドが呼び出されなければ、望ましい結果が得られます。 onComplete()を使用していない場合、または何らかの理由でonComplete()が呼び出されていない場合、何も印刷されません。

関連する問題