2017-10-12 62 views
2

我是新來RxJava和RxAndroid,並試圖瞭解Observable.justSingle之間的差異。它看起來每個都被設計爲爲其觀察者發射一個項目。Observable.just VS單在RxJava

這裏是我的簡單的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

您的代碼工作正常。第一個你發射物品,但不在第二個。

您需要更改到

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); 
       } 
      })); 

現在你應該在onSuccess看到 「項目」。

說你想要做一些操作,然後返回一個字符串按照以上建議,你會怎麼做。假設你的操作失敗,你可以再做e.onError(new IOException());),現在你應該看到onError的錯誤

+0

好的,謝謝。但底線是,它們都旨在發出一個事件,對吧? –

+0

@MaksimDmitriev https://github.com/ReactiveX/RxJava/wiki/What%27s-different-in-2.0。檢查文檔我覺得文檔有一個更好的解釋 – Raghunandan

+1

@MaksimDmitriev肯定。它在你需要使用可觀察/懸浮劑/單/也許/ Completable什麼情況下要看。查看這個RxJava用例的示例https://medium.com/google-developers/room-rxjava-acb0cd4f3757 – Raghunandan