2017-08-24 8 views
0

J'ai un événement click qui doit faire une requête réseau.L'abonnement RxJava2 n'est pas appelé lorsque le mappage observable est complétable

RxView.clicks(button) 
    .flatMapCompletable({ x -> networkCall() }) 
    .subscribe(...) 

Le clic est un observable.
networkCall Renvoie une valeur acceptable.
Cependant le bloc à l'intérieur subscribe n'est jamais appelé quand je tape le bouton.

J'ai aussi essayé

RxView.clicks(button) 
    .flatMap({ x -> networkCall().toObservable<Void>() }) 
    .subscribe(...) 

Comment puis-je obtenir ce travail afin que chaque fois que je tape sur le bouton, une demande de réseau est fait et est ensuite traitée dans le subscribe.

EDIT:

Je ne l'ai pas fait les choses réseau pourtant si actuellement il est juste

public Completable networkCall() { 
    Completable.complete(); 
} 

Il est garanti à remplir.

+0

Comment remplacer l'abonnement? Je ne suis pas sûr, mais si vous venez de remplacer le 'onNext', cela pourrait ne pas fonctionner. Avez-vous également remplacé la fonction 'onComplete' avec votre abonné? – Christopher

+0

En ce qui concerne les docs, je dirais aussi que flatmapCompletable n'est pas la bonne option pour vous: Mappe chaque élément de l'amont Observable en CompletableSources, s'abonne à eux et attend jusqu'à ce que l'amont et tous les CompletableSources se terminent. -> 'RxView.clicks' ne se termine pas du tout! http://reactivex.io/RxJava/javadoc/io/reactivex/Observable.html#flatMapCompletable-io.reactivex.functions.Function- – Christopher

+0

@Christopher J'avais le sentiment que "flatmapCompletable" ne serait pas approprié, c'est pourquoi je a également essayé le deuxième bloc de code. J'ai surchargé 'onNext' et' onComplete' et juste ajouté des logs et des points d'arrêt dans ces méthodes et il ne frappe pas non plus. Cependant, même avec le second bloc de code, je suis toujours inquiet car cela pourrait mettre fin au flux lorsque 'onComplete' est appelé à partir de l'appel réseau. – SunnySydeUp

Répondre

2

Le boîtier flatMap a besoin d'éléments, sinon son onComplete ne sera jamais déclenché en raison de la source de clics jamais terminée qui est déjà mentionnée. Par exemple:

RxView.clicks(button) 
.flatMap({ x -> networkCall().andThen(Observable.just("irrelevant")) }) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe({ v -> System.out.println(v)}, { e -> e.printStackTrace() })