2017-10-12 20 views
2

私はRxJavaとRxAndroidを初めて使い、Observable.justSingleの違いを理解しようとしています。それはそれぞれがオブザーバーのために1つのアイテムを放出するように設計されているように見えます。Observable.just対RxJavaのシングル

ここに2つのボタンを備えた私の簡単なAndroidのアクティビティのコードを示します。最初のボタンはObservableを作成し、第二ボタンがSingleを作成します。

findViewById(R.id.just).setOnClickListener(view -> Observable.just("item").subscribe(
     new Observer<String>() { 
      @Override 
      public void onSubscribe(Disposable d) { 
       Log.d(LOG_TAG, "just onSubscribe"); 
      } 

      @Override 
      public void onNext(String s) { 
       Log.d(LOG_TAG, "just s=" + s); 
      } 

      @Override 
      public void onError(Throwable e) { 
       Log.e(LOG_TAG, "just e=" + e); 
      } 

      @Override 
      public void onComplete() { 
       Log.d(LOG_TAG, "just onComplete"); 
      } 
     })); 

findViewById(R.id.single).setOnClickListener(
     view -> Single.create((SingleOnSubscribe<String>) e -> { 
     }) 
       .subscribe(new SingleObserver<String>() { 
        @Override 
        public void onSubscribe(Disposable d) { 
         Log.d(LOG_TAG, "single onSubscribe"); 
        } 

        @Override 
        public void onSuccess(String o) { 
         Log.d(LOG_TAG, "single onSuccess"); 
        } 

        @Override 
        public void onError(Throwable e) { 
         Log.d(LOG_TAG, "single onError", e); 
        } 
       })); 

私は「ジャスト」ボタン、onSubscribeonNext、およびonCompleteが呼び出されるを押すと。

「シングル」ボタンを押すと、SingleObserver#onSubscibeのみが呼び出され、SingleObserver#onSuccessは呼び出されません。私のbuild.gradleでRxJavaとRxAndroidの

バージョン:

compile 'io.reactivex.rxjava2:rxandroid:2.0.1' 
// Because RxAndroid releases are few and far between, it is recommended you also 
// explicitly depend on RxJava's latest version for bug fixes and new features. 
compile 'io.reactivex.rxjava2:rxjava:2.1.3' 

答えて

2

は、あなたのコードは期待通りに働いています。最初はアイテムを出すが、2番目のアイテムは出さない。

あなたは今、あなたはonSuccessで "項目" を参照してくださいする必要があり

findViewById(R.id.single).setOnClickListener(
    view -> Single.create((SingleOnSubscribe<String>) e -> { 
      if(!e.isDisposed()) 
      e.onSuccess("item"); 
    }) 
      .subscribe(new SingleObserver<String>() { 
       @Override 
       public void onSubscribe(Disposable d) { 
        Log.d(LOG_TAG, "single onSubscribe"); 
       } 

       @Override 
       public void onSuccess(String o) { 
        Log.d(LOG_TAG, "single onSuccess" + " "+o); 
       } 

       @Override 
       public void onError(Throwable e) { 
        Log.d(LOG_TAG, "single onError", e); 
       } 
      })); 

に変更する必要があります。

いくつかの操作を行い、上で示唆したとおりの文字列を返すとします。あなたの操作が失敗したとしたらe.onError(new IOException());)を実行すると、エラーが表示されるはずです。onError

+0

ありがとう、ありがとう。しかし結論は、両方とも1つのイベントを出すように設計されているということですね。 –

+0

@MaksimDmitriev https://github.com/ReactiveX/RxJava/wiki/What%27s-different-in-2.0。ドキュメントをチェックしてください。ドキュメントにはより良い説明があります。 – Raghunandan

+1

@MaksimDmitrievはい。どのような場合にObservable/Flowable/Single/Maybe/Completableを使用する必要があるかによって異なります。これをチェックして、RoomとRxJavaの使用例を確認してください。https://medium.com/google-developers/room-rxjava-acb0cd4f3757 – Raghunandan

関連する問題