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:
- Pourquoi at-on le
ProtocolViolationException
jetés en premier lieu? - 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?
- Comment puis-je réutiliser l'observateur en utilisant une seule instance?
Est-ce que 1 & 2 est également vrai pour 'DisposableObserver'? Environ 3, j'essaie de limiter le nombre de cas pour les observateurs. – Harry
Je me suis référé à ceux que "ses cousins" oui. – akarnokd