2017-10-05 43 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按我的预期工作! –