2016-06-30 2 views
0

Мне нужно запустить subscribeOn action в той же теме, что и Observable. Я нашел решение, но, похоже, это не самое лучшее. В основном я использую тот же scheduler для начальной observable и observable который doOnSubscribe возвращается:Выполнение действия subscribeOn в той же теме, что и Observable

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, решение, которое я упоминаю в вопросе, является только одним.