2017-10-04 5 views
1

J'essaie de réutiliser un observateur pour un flux unique et observable en créant une seule instance de DisposableSingleObserver/DisposableObserver et en le passant à travers la méthode subscribeWith() sur le flux comme ci-dessous :L'utilisation de l'observateur éliminé ne se réabonne pas à la source

public class SomeClass { 
    private DisposableSingleObserver<Object> observer; 

    public SomeClass() { 
     observer = new DisposableSingleObserver<Object>() { 
      @Override 
      public void onSuccess(Object object) { 
       ... 
      } 

      @Override 
      public void onError(Throwable throwable) { 
       ... 
      } 
     }; 
    } 

    public void doSomeStuff() { 
     singleStream.subscribeOn(...) 
      .observeOn(...) 
      .subscribeWith(observer); 
    } 
} 

le code ci-dessus a donné lieu à ProtocolViolationException quand j'ai essayé de souscrire à l'instance unique d'observateur à plusieurs reprises avec le message:

io.reactivex.exceptions.ProtocolViolationException: Il est interdit de souscrire w avec un (n) com.package.name.SomeClass $ 1 plusieurs fois. Veuillez créer une nouvelle instance de com.package.name.SomeClass $ 1 et souscrire à la source cible à la place.

Je modifié le code un peu comme ci-dessous:

public class SomeClass { 
    ... 

    public void doSomeStuff() { 
     if (observer != null) { 
      observer.dispose(); 
     } 

     singleStream.subscribeOn(...) 
      .observerOn(...) 
      .subscribeWith(observer); 
    } 
} 

Quand j'exécuté le code ci-dessus, la ProtocolViolationException n'était plus jeté et j'ai pu obtenir avec succès l'événement du seul flux. Mais quand j'ai essayé d'appeler la méthode doSomeStuff() quelques temps, il s'est terminé avec succès au premier appel, mais n'a pas émis d'événement en deuxième appel. J'ai été en mesure de confirmer que l'abonnement est passé par doOnSubscribe() les deux fois, mais l'événement d'émission de code pour le flux unique n'a jamais été exécuté au deuxième appel. J'ai donc trois questions:

  1. Pourquoi at-on le ProtocolViolationException jetés en premier lieu?
  2. Pourquoi ai-je pu obtenir l'événement lors de la première inscription, mais pas lors de la deuxième inscription, même si nous nous sommes abonnés à la source dans les deux cas?
  3. Comment puis-je réutiliser l'observateur en utilisant une seule instance?

Répondre

1

1) Vous n'êtes pas autorisé à réutiliser le DisposableSingleObserver et ses cousins ​​car ils sont à état et usage unique. Ceci est dû au protocole mandaté par Single: exactement un onSubscribe suivi au plus d'un onSuccess ou onError. Un deuxième abonnement viole ce protocole. 2) La mise au rebut du DisposableSingleObserver le met dans un état éliminé et toute tentative d'abonnement subséquente sera considérée comme immédiatement éliminée.

3) Vous ne devriez pas. Pourquoi voulez-vous vous abonner plusieurs fois et pourquoi ne pouvez-vous pas utiliser un nouveau DisposableSingleObserver à chaque fois. Vous devriez repenser votre flux de données.

+0

Est-ce que 1 & 2 est également vrai pour 'DisposableObserver'? Environ 3, j'essaie de limiter le nombre de cas pour les observateurs. – Harry

+0

Je me suis référé à ceux que "ses cousins" oui. – akarnokd