2016-06-30 8 views
0

Observableと同じスレッドでsubscribeOnアクションを実行する必要があります。私は解決策を見つけましたが、それは最良ではないようです。基本的に私は、同じ初期observableためschedulerobservableを使用したdoOnSubscribeリターン:Observableと同じスレッドでsubscribeOnアクションを実行する

Scheduler singleThreadScheduler = Schedulers.from(Executors.newSingleThreadExecutor()); 

Observable<Object> obs = Observable.create(subscriber -> { 

    System.out.println("onNext at: " + Thread.currentThread()); 

    subscriber.onNext(new Object()); 
    subscriber.onCompleted(); 

}).subscribeOn(singleThreadScheduler).observeOn(Schedulers.newThread()); 

obs = obs.doOnSubscribe(() -> System.out.println("doOnSubscribe at: " + Thread.currentThread())).subscribeOn(singleThreadScheduler); 

obs.subscribe(o -> { 
    System.out.println("result at: " + Thread.currentThread()); 
}); 

ログイン:

doOnSubscribe at: Thread[pool-1-thread-1] //runs on the same thread 
onNext at: Thread[pool-1-thread-1]  //runs on the same thread 
result at: Thread[RxNewThreadScheduler-1] 

はそれを達成するために任意のより良いまたは多分より多くの標準的な方法はありますか?

+0

なぜあなたはそれを行う必要がありますか?観測可能なチェーンの外側にスレッドローカル情報がありますか?また、 'Scheduler.immediate()'があります。 –

+1

これは1.xの同じスレッドに戻ることができる唯一の方法です。標準スケジューラはワーカースレッドを渡します。スケジューラを適用したときに同じことを保証するものではありません。 – akarnokd

答えて

-1

akarnokdが指摘したように、私がこの問題で言及した解決策は1つだけです。

関連する問題