2017-10-05 7 views
-1

で呼び出されていないが、コードの短い抜粋ですか?私はこのコードを作業するために何をすべきですか?元のコードでは.toList()メソッドを使用できません。RxJava2:onCompleteのここflatMapIterable

+0

なぜあなたは 'BehaviorSubject'を使用しているを取りますか?明示的にonComplete()を呼び出さなければなりません。 – akarnokd

+1

ここで 'onComplete'を呼び出すのはなぜですか?あなたの主題はまだアイテムを放出していません - あなたはまだ項目でそれに 'onNext'を呼び出すことができます。 – zsmb13

+0

@ zsmb13 onCompeteの呼び出しはsubjectと同じですか?私はそれがflatMapIterableで観測可能に再定義されると思った。 –

答えて

2

BehaviorSubjectフォームには、onCompleteが呼び出されていない限り、無限のソースがあります。従ってflatMapIterableは完了せず、あなたのonCompleteハンドラは呼び出されません。

だから、どちらかあなたは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() // <----------------------------------------------------- 

またはあなたがそれの最大1つのアイテム

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は答えてくれてありがとうございますが、 'BehaviorSubject'を完了すると、新しい加入者は私が期待したように' onNext'イベントを受信しません。 –

+1

この場合、 'ReplaySubject'または' AsyncSubject'を使用してください。 – akarnokd

+0

@akarnoldありがとうございます。 AsyncSubjectは私が期待どおりに動作します! –

関連する問題