为什么head不取消订阅

时间:2014-06-09 16:36:07

标签: scala rx-java

假设您在Observable

中有以下rxjava-scala-0.18.4
@volatile var dorun = true
var subscriber: Subscriber[String] = null
val myObs = Observable { obs: Subscriber[String] =>
  subscriber = obs
  Subscription { println("unsubscribed"); dorun = false }
}

val sub = myObs.head.subscribe(println(_))

assertTrue(dorun)

subscriber.onNext("hello")
Thread.sleep(500)
assertFalse(dorun)

subscriber.onNext("world")
Thread.sleep(500)
assertFalse(dorun)

第二个断言失败,这意味着head没有取消订阅。我对Observables的理解是错误的还是在第一个元素被发出后head取消订阅了?

1 个答案:

答案 0 :(得分:3)

查看您的subscribe()方法:循环直到run设置为false,但发生这种情况的唯一方法是关闭订阅。问题是还没有人订阅:循环阻止你返回。在{em>交付第一个项目后,head运营商无法终止基础订阅,因为它还没有完成订阅。因此,你只需要永远循环。

一种解决方案是将您的循环移动到Schedulers.trampoline()上安排的操作中。然后,从subscribe()返回后,事件将被传递一段时间。

此外,在您的subscribe()方法中,您似乎需要将新的订阅对象添加到传入的Subscriber中,如下所示:     

val myObs = Observable {
    obs: rx.lang.scala.Subscriber[String] =>
        ...

        obs.add(
            Subscription {
                dorun = false
                println("unsubscribed")
            }
        )
}