2017-02-09 13 views
3

RxJavaにRxAndroidのAndroidSchedulers.mainThread()と同義のScheduler APIがありますか? 新しいスレッドでタスクをスケジュールして、それをJavaのメインスレッドで観察したいのですが、どうすればいいですか?RxJavaのAndroidSchedulers.mainThread()の代替手段は何ですか?

編集以下 は例RxSubscriptionあるsystem.inはコメントしてObservable.intervalは別のスレッドで実行中に、メインスレッドが殺されています。 Androidでは、observeOn(AndroidSchedulers.MainThread)と言うことができ、その後の操作はメインスレッドで実行されます。私はAndroidSchedulersがRxAndroidの一部であるので、Javaで同様のスケジューラーを探しています。

import java.io.IOException; 
import java.util.concurrent.TimeUnit; 
import rx.Observable; 

public class Main { 

public static void main(String[] args) throws InterruptedException, IOException { 

    Observable<Long> values = Observable.interval(1000, TimeUnit.MILLISECONDS); 
    values.subscribe(
      v -> System.out.println("Received: " + v), 
      e -> System.out.println("Error: " + e), 
      () -> System.out.println("Completed") 
    ); 
    //System.in.read(); 
} 
} 
+1

*なぜ*あなたがそれを必要とするのか興味深いですか?メインスレッドは1つだけなので、多くのオプションはありません。 – FWeigl

+0

特定のスレッドで何かを観察する必要があるのはなぜですか? Androidのメインスレッドは特別な意味を持ちますが、あなたの要件は何ですか? –

+0

@Ascorbinは編集した質問を精巧にする –

答えて

5

RxJava 1.xのブロックスケジューラがないため、現在「メイン」Javaスレッドに戻ることはできません。

compile "com.github.akarnokd:rxjava2-extensions:0.15.1" 

BlockingScheduler

のこのタイプ:

場合、あなたはRxJava 2.xのにアップグレードすることができ、私は現在のスレッドに "固定" することができ、特別なスケジューラを持っていますスケジューラは "現在のスレッド"、具体的にはexecute()メソッドを呼び出したスレッドで実行ループを実行します。このメソッドは、shutdown()が呼び出されるまでブロックします。このタイプのスケジューラでは、他のスレッドから「メイン」スレッドに戻ることができます。

0

はい、RxJavaにはスケジューラがあります。任意のスレッドにメッセージを送信するには、他のスレッドからのメッセージを待っている何らかのメッセージループが必要です。 Androidではこれがあなたのルーパーです。 Javaでは、自分でそれを行う必要があります。スケジューラはそのスレッドにメッセージを送信し、そのメッセージ応答で作業を行います。そのためのメカニズムは、メッセージキューの実装方法に依存しますが、かなり簡単です。

関連する問題