2017-10-05 20 views
-1

Voici court extrait de code:RxJava2: onComplete pas appelé avec flatMapIterable

val subject = BehaviorSubject.createDefault(emptyList<Int>()) 
    subject.onNext(Arrays.asList(1, 2, 3)) 
    subject.flatMapIterable { list: List<Int> -> list } 
      .subscribeBy(
        onNext = { l("on next", it) }, 
        onComplete = { l("on complete") } 
      ) 

Pourquoi onComplete ne pas appeler ici? Qu'est-ce que je devrais faire pour travailler ce code? Parce que dans le code d'origine, je ne peux pas utiliser la méthode .toList().

+0

Pourquoi utilisez-vous un 'BehaviorSubject'? Vous devez appeler 'onComplete()' dessus explicitement. – akarnokd

+1

Pourquoi 'onComplete' serait appelé ici? Votre sujet n'a pas encore fini d'émettre des objets - vous pouvez toujours appeler 'onNext' avec des objets. – zsmb13

+0

@ zsmb13 L'appel de onCompete est donc le même que dans subject? Je pensais qu'il sera redéfini par observable dans flatMapIterable. –

Répondre

2

Le BehaviorSubject que vous avez sous sa forme est une source infinie, sauf si onComplete y est appelée. Par conséquent flatMapIterable ne se terminera pas et votre gestionnaire onComplete ne sera jamais appelé.

Donc, soit vous remplissez le BehaviorSubject:

val subject = BehaviorSubject.createDefault(emptyList<Int>()) 
subject.onNext(Arrays.asList(1, 2, 3)) 
subject.flatMapIterable { list: List<Int> -> list } 
     .subscribeBy(
       onNext = { l("on next", it) }, 
       onComplete = { l("on complete") } 
     ) 

subject.onComplete() // <----------------------------------------------------- 

ou vous prenez au plus un élément de celui-ci

val subject = BehaviorSubject.createDefault(emptyList<Int>()) 
subject.onNext(Arrays.asList(1, 2, 3)) 
subject.take(1) // <---------------------------------------------------------- 
     .flatMapIterable { list: List<Int> -> list } 
     .subscribeBy(
       onNext = { l("on next", it) }, 
       onComplete = { l("on complete") } 
     ) 
+0

@akarnold Merci pour la réponse, mais quand j'ai terminé 'BehaviorSubject', les nouveaux abonnés ne recevront pas l'événement' onNext', comme je m'y attendais. –

+1

Utilisez 'ReplaySubject' ou' AsyncSubject' dans ce cas. – akarnokd

+0

@akarnold merci. AsyncSubject fonctionne comme prévu! –