假设您在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
取消订阅了?
答案 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")
}
)
}