1

私は

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でカスタムスケジューラを使用する方法

4

1 に答える 1

2

ここでの問題は、ここで RxJava と RxScala のコードを混在させることです。ご覧のとおり、RxScala は RxJava 機能の単なるラッパーです。前者は後者に転送するだけで、「実際の」実装はありません。これは、2 つ以上のバージョンではなく 1 つのバージョンのみを維持する必要があるため便利です。

schedulerあなたの例のタイプはrx.Schedulerであるため、 RxJavaSchedulerです。ただし、RxScala であるsubscribeOnを提供する必要があります。したがって、RxJava を RxScala のものに変換する必要があります。rx.lang.scala.SchedulerSchedulerScheduler

ただし、あなたの場合、より良い方法があります。ファクトリメソッドを使用してExecutors.newSingleThreadExecutorラップします。次に、これを にラップすると、 で使用できるスケジューラが得られます。コードは次のようになります (どのスレッドで実行されているかを確認するための print ステートメントを含めました)。scala.concurrent.ExecutionContextfromExecutorrx.lang.scala.schedulers.ExecutionContextSchedulersubscribeOn

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()
于 2016-03-28T14:00:34.030 に答える