2016-09-14 6 views
1

オブジェクト(都市)を受け取って、このデータを別のスレッド(モバイル画面に反映してこの都市をDBに保存)に送りたい。これは私のコードです:別のスレッドでonNextを呼び出す(RxJava Android)

private CompositeSubscription subscriptions; 
    ... 
     @Override 
      public void onAddButtonClick(String cityName) { 
       Observable<City> obs = repository.getCity(cityName); 
       if (obs != null){ 
        Subscription subscription = obs 
          .subscribeOn(backgroundThread) 
          .observeOn(mainThread) 
          .subscribe(
            city -> { 
             view.cityExists(); 
             repository.saveCityToDb(city); 
            } 

          ); 

        subscriptions.add(subscription);  
       } else { 
        view.showCouldNotFindCity(); 
       }  
      } 

    @Override 
    public void subscribe() { 
     subscriptions = new CompositeSubscription(); 
    } 

    @Override 
    public void unsubscribe() { 
     subscriptions.clear(); 
    } 

だから私は、バックグラウンドスレッドでUIスレッドとrepository.saveCityToDb(city);上で実行したいview.cityExists();この方法。どうしたらいいですか? Observable<City>を返しgetCity(...);

方法:これはトリックを行う必要があります

public Observable<City> getCity(String name){ 
     return fileRepository.getCityFromFile(name); 
    } 

答えて

0

あなたはflatMapオペレータのために見えるかもしれません。 Observableと同じスレッドで操作できます(Observableを変換します)。

Subscription subscription = obs 
    .subscribeOn(backgroundThread) 
    .flatMap(repository::saveCityToDb) 
    .observeOn(mainThread) 
    .subscribe(city -> view.cityExists()); 

機能

repository::saveCityToDb

Observableを継続するために何かを返さなければならないことを、覚えておいてください。私はオブジェクトObservable.just(city)を返すことを提案します。

+0

正しいことをしているのかどうかわかりませんが、書き込みすると動作します。リポジトリ:: saveCityToDb(.flatMap(city - > repository: :saveCityToDb))、saveCityToDb()から都市オブジェクトを返しませんが、Observable を返します。これはsaveCityToDb()です: public Observable saveCityToDb(都市){ return Observable.just(city); } – alla

+0

あなたの提案に基づいて私の答えを修正しました。 –

2

Subscription subscription = obs 
     .subscribeOn(backgroundThread) 
     .doOnNext(city -> view.cityExists()) 
     .observeOn(mainThread) 
     .subscribe(repository::saveCityToDb); 
+0

多分私は何かを理解していないかもしれませんが、このコードを使って私のログによると、メソッドsaveCityToDbは開始されません。 – alla

+0

view.cityExistsは呼び出されていますか? '.doOnNext(dummy - > Log.log(...))'を自由に振って、すべてのステップが正しい順序で実行されていることを確認することができます。 –

+0

view.cityExistsが呼び出されます。 doOnNext()の後になっていないようです。 – alla

関連する問題