如何在RxScala中使用自定义调度程序?

时间:2016-03-27 03:06:01

标签: rx-scala

我尝试

val executors = Executors.newSingleThreadExecutor()
val scheduler = Schedulers.from(executors)
Observable.just[Int](1,2,3).subscribeOn(scheduler)

输出错误

Error:(103, 43) type mismatch;
found   : rx.Scheduler
required: rx.lang.scala.Scheduler
Observable.just[Int](1,2,3).subscribeOn(scheduler)
                                      ^ 

如何在RxScala中使用自定义计划程序?

1 个答案:

答案 0 :(得分:2)

这里的问题是你在这里混合使用RxJava和RxScala代码。你看,RxScala只是RxJava功能的包装器;前者只转发给后者而没有任何“真正的”实施。这很有用,因为您只需要维护1个版本而不是2个或更多版本。

示例中scheduler的类型为rx.Scheduler,因此它是RxJava Scheduler。但是,subscribeOn要求您提供rx.lang.scala.Scheduler,即RxScala Scheduler。因此,您需要将RxJava Scheduler转换为RxScala中的一个。

但是,对于您的情况,有一种更好的方法:使用Executors.newSingleThreadExecutor工厂方法将scala.concurrent.ExecutionContext包裹到fromExecutor。然后将其包装到rx.lang.scala.schedulers.ExecutionContextScheduler中,您就拥有了可以在subscribeOn中使用的调度程序。你的代码看起来像这样(我包含了一个print语句来查看运行的东西):

val e = ExecutionContext.fromExecutor(Executors.newSingleThreadExecutor)
val s = ExecutionContextScheduler(e)

Observable.just(1, 2, 3)
    .subscribeOn(s)
    .doOnNext(x => println(s"thread - ${Thread.currentThread().getName}, value - $x"))
    .subscribe()