2017-10-12 10 views
2

Je suis nouveau à RxJava et RxAndroid et en essayant de comprendre la différence entre Observable.just et Single. Il semble que chacun soit conçu pour émettre un objet pour son observateur.Observable.juste vs Simple dans RxJava

Voici le code de mon activité Android simple avec deux boutons. Le premier bouton crée une Observable, et le second bouton crée une 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); 
        } 
       })); 

Lorsque j'appuie sur le "Just" bouton, onSubscribe, onNext et onComplete sont appelés.

Lorsque j'appuie sur le bouton "Single", seul le SingleObserver#onSubscibe est appelé, et SingleObserver#onSuccess ne l'est pas.

Les versions de RxJava et RxAndroid dans mon build.gradle:

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' 

Répondre

2

Votre code fonctionne comme prévu. Avec le premier, vous émettez un objet mais pas dans le second.

Vous devez changer

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

Maintenant, vous devriez voir "article" dans onSuccess. Dites que vous voulez faire une opération puis renvoyez une chaîne que vous feriez comme suggéré ci-dessus. Supposons que votre opération échoue, vous pouvez alors faire e.onError(new IOException());), maintenant vous devriez voir l'erreur dans onError

+0

OK, merci. Mais l'essentiel est qu'ils sont tous les deux conçus pour émettre un événement, n'est-ce pas? –

+0

@MaksimDmitriev https://github.com/ReactiveX/RxJava/wiki/What%27s-different-in-2.0. vérifier les docs je pense que les docs ont une meilleure explication – Raghunandan

+1

@MaksimDmitriev oui. et cela dépend de dans quels cas vous devez utiliser Observable/Flowable/Single/Maybe/Completable. Cochez ceci un exemple d'utilisation de RxJava avec Room https://medium.com/google-developers/room-rxjava-acb0cd4f3757 – Raghunandan