2016-09-26 9 views
0

名前からファイルから特定の都市を取得したいとします。もし都市が見つからなければ、私はObservable.empty()を返します。それ以外の場合はObservable.just(city)を返します。RxJava:Observable.justの後もObservable.empty()が呼び出されます。

public void onAddButtonClick(String cityName) { 
     Subscription subscription = repository.getCity(cityName)   
       .subscribeOn(backgroundThread) 
       .flatMap(city -> repository.saveCityToDb(city)) 
       .observeOn(mainThread)  
       .subscribe(
         city -> view.cityExists(), 
         throwable -> view.showCouldNotFindCity(), 
         () -> view.showCouldNotFindCity() 
       ); 

     subscriptions.add(subscription); 
    } 

そして方法getCity(): は、ここでは、コードです

public Observable<City> getCity(String cityName){ 
     return Observable.defer(() -> { 
      try { 
       InputStream is = assetManager.open(FILE_NAME); 
       Scanner scanner = new Scanner(is); 
       while (scanner.hasNextLine()) { 
        String line = scanner.nextLine(); 
        if (line.toLowerCase().contains(cityName.toLowerCase())) { 
         String[] cityParams = line.split("\t"); 
         City city = new City(); 
         city.setId(Long.parseLong(cityParams[0])); 
         city.setName(cityParams[1]); 
         return Observable.just(city); 
        } 
       } 

      } catch (IOException e) { 
       return Observable.error(e); 
      }   
      return Observable.empty(); 
     }); 
    } 

しかし、都市が発見された場合に問題があり、それはそれは私がなぜ知らないreturn Observable.empty();に行くObservable.just(city);を返します。とにかくコード() -> view.showCouldNotFindCity()が呼び出されます。

+2

エラーがない限り、 'view.showCouldNotFindCity()'が常に呼び出されます。これはあなたが望むものではありませんか? – Will

+0

@ウィルしかし、私は2つの選択肢があります:都市が見つかった場合、都市が見つからない場合。コードはルーツルによって異なります。それを行う最善の方法は何ですか? – alla

答えて

1

問題はonCompletedハンドラでthis() - > view.showCouldNotFindCity()を呼び出すことです。 RxJavaのjust()メソッドを見てみると、最初にonNextを呼び出してからsubscriberのonCompletedメソッドを呼び出すことがわかります。都市が見つかるとcity-> view.cityExists()が呼び出された後、すぐに() - > view.showCouldNotFindCity()の直後に呼び出されます。

getCityメソッドでcityが見つからない場合は、エラーが発生します。あなたのonErrorは既にdesired() - > view.showCouldNotFindCity()メソッドを呼び出し、それをonCompletedハンドラから削除します。

+0

あなたの答えをありがとう。しかし、いつObservable.empty()を使うことができますか?とにかくif() - > view.showCouldNotFindCity()が呼び出されますか?どんな場合ですか? – alla

+0

通常、onNextハンドラでイベントのストリームを処理し、onCompletedはクリーンアップに使用されます。また、ストリームをただちに完了させる代わりに、onNextで何かをプッシュしないときは空を使用できます。 –

関連する問題