我尝试
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
中使用自定义计划程序?
答案 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()