2017-02-09 13 views
3

Есть ли планировщик api в RxJava, синонимом AndroidSchedulers.mainThread() в RxAndroid. Итак, если я планирую задачу в новом потоке, и я хочу наблюдать ее на главной теме Java, как бы я это сделал?Что является альтернативой AndroidSchedulers.mainThread() в RxJava?

редактировать Ниже приведен пример RxSubscription с System.in прокомментировал главный поток убит в то время как Observable.interval работает в отдельном потоке. В Android я могу сказать, что watchOn (AndroidSchedulers.MainThread), и любая операция после этого будет работать в основном потоке. Я ищу аналогичный планировщик на Java, поскольку AndroidSchedulers является частью RxAndroid.

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

Было бы интересно узнать, почему * * Вы нуждаетесь в этом. Поскольку существует только один основной поток, вариантов не так много. – FWeigl

+0

Зачем вам нужно что-то наблюдать в определенной теме? в Android основной поток имеет особое значение, каково ваше требование? –

+0

@Ascorbin отредактировал вопрос для уточнения –

ответ

5

Возврат к «главному» потоку Java в настоящее время невозможен, так как нет блокирующего планировщика для RxJava 1.x.

В случае, если вы можете обновить RxJava 2.x, у меня есть специальный планировщик, который может быть "возлагали" для текущего потока:

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

BlockingScheduler

Этот тип scheduler запускает цикл выполнения в «текущем потоке», точнее, поток, который вызвал метод execute(). Метод блокируется до выключения(). Этот тип планировщика позволяет вернуться к «основному» потоку из других потоков.

public static void main(String[] args) { 
    BlockingScheduler scheduler = new BlockingScheduler(); 

    scheduler.execute(() -> { 
     Flowable.range(1, 10) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(scheduler) 
      .doAfterTerminate(() -> scheduler.shutdown()) 
      .subscribe(v -> System.out.println(v + " on " + Thread.currentThread())); 
    }); 

    System.out.println("BlockingScheduler finished"); 
} 
0

Да, у RxJava есть планировщики. Чтобы отправить сообщение в любой поток, вам нужно, чтобы какой-то цикл сообщений ожидал сообщений из других потоков. В Android это ваш Looper. На Java вам нужно будет сделать это самостоятельно. Затем ваш планировщик отправляет сообщение этому потоку и выполняет работу в этом ответе на сообщения. Механизм этого зависит от того, как вы реализуете свою очередь сообщений, но должно быть довольно тривиальным.

 Смежные вопросы

  • Нет связанных вопросов^_^