2015-03-19 2 views
0

Этот код работаетНевозможно подписаться Наблюдаемая на NewThread

Observable.range(0, 9) 
    .subscribe(new Action1<Integer>() { 
     public void call(Integer item) { 
      LOG.debug("item:{}", item); 
     } 
}); 

получаю: DEBUG: net.test.rx2.App - вещь: 0 до 9. Но после один скачет подписку на всех. Пожалуйста, посоветуйте, как поймать Наблюдаемый.

Observable.range(0, 9) 
    .subscribeOn(Schedulers.newThread()) 
    .subscribe(new Action1<Integer>() { 
     public void call(Integer item) { 
      LOG.debug("item:{}", item); 
     } 
}); 

ответ

2

Оба примера отлично подходят для меня. Я предполагаю, что вы тестируете это в основном методе приложения. Второй пример запускает наблюдаемый в новом потоке, как следствие, основной поток больше не имеет операторов блокировки. Поскольку ничто не блокирует основной поток, JVM решает, что приложение может быть прекращено. Вам нужно как-то заблокировать основной поток, чтобы JVM не закрывал ваше приложение преждевременно (то есть до того, как все события будут выпущены Observable).

Например, вы можете добавить простое заявление System.in.read блокировать основной поток:

public static void main(String[] args) throws IOException { 
    Observable.range(0, 9) 
     .subscribeOn(Schedulers.newThread()) 
     .subscribe(new Action1<Integer>() { 
      public void call(Integer item) { 
       LOG.debug("item:{}", item); 
      } 
     }); 

    System.in.read(); // block to prevent premature JVM shutdown 
} 

Теперь вы должны иметь возможность наблюдать результат наблюдаемого выражения.

+0

Большое спасибо. Ты прав. Как вернуть обработку в основной поток? (в RxAndroid это выглядит как .observeOn (AndroidSchedulers.mainThread())) Я вижу toBlocking(). [first, last, ...] есть что-нибудь еще? – YNChumak

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