2017-10-05 79 views
-1

這裏是代碼一小段:RxJava2:不是的onComplete與所謂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") } 
      ) 

爲什麼onComplete沒有不叫嗎?我應該怎麼做這個代碼?因爲在原始代碼中我不能使用.toList()方法。

+0

你爲什麼要使用'BehaviorSubject'採取在它最多一個項目?你必須明確地調用onComplete()。 – akarnokd

+1

爲什麼'onComplete'在這裏被調用?你的主題還沒有完成發佈項目 - 你仍然可以通過項目調用onNext。 – zsmb13

+0

@ zsmb13所以調用onCompete與主題相同?我認爲它將通過flatMapIterable中的observable重新定義。 –

回答

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() // <----------------------------------------------------- 

,或者你

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按我的預期工作! –