2016-12-02 1 views
0

Я начинаю изучать Rx для Android и получаю одну ошибку. Это мой код:ObserveOn не работает

В моей Subscriber я печатаю войти имя текущего резьбы:

Subscriber<Integer> integerSubscriber = new Subscriber<Integer>() { 
     // ... onCompleted, onError 
     @Override 
     public void onNext(Integer s) { 
      Log.e("RX", "threadName " + getCurrThreadName()); 
     } 
};  

Здесь я хочу, чтобы запустить код в фоновом режиме и получить данные из Наблюдаемые в mainThread:

ArrayList list = new ArrayList(); 
list.add(...) // creating data list 

Observable.from(list) 
    .map(TransformFunc.getTransformer()) 
    .subscribeOn(AndroidSchedulers.mainThread()) 
    .observeOn(Schedulers.from(executor)) 
    .subscribe(integerSubscriber); 

... 

Другой код: static String getCurrThreadName() { return Thread.currentThread(). GetName(); }

static class TransformFunc implements Func1<String, Integer> { 

    private static TransformFunc instance; 

    static TransformFunc getTransformer() { 
     ... // return instance 

     @Override 
     public Integer call(@NonNull String s) { 
      ... 
       TimeUnit.SECONDS.sleep(4); 
       Log.e("RX", "threadName " + getCurrThreadName()); 
      ... 

      return s.length(); 
     } 
} 

Но когда я запускаю этот код на устройстве я вижу белый экран 5-10 секунд и это в журналах:

12-02 16:34:39.374 26086-26086/com.shevart.fitnessnotes E/RX: threadName main 
12-02 16:34:39.378 26086-26180/com.shevart.fitnessnotes E/RX: threadName pool-1-thread-2 
12-02 16:34:43.375 26086-26086/com.shevart.fitnessnotes E/RX: threadName main 
12-02 16:34:43.379 26086-26216/com.shevart.fitnessnotes E/RX: threadName pool-1-thread-3 
12-02 16:34:47.376 26086-26086/com.shevart.fitnessnotes E/RX: threadName main 
12-02 16:34:47.396 26086-26253/com.shevart.fitnessnotes E/RX: threadName pool-1-thread-4 
12-02 16:34:51.376 26086-26086/com.shevart.fitnessnotes E/RX: threadName main 
12-02 16:34:51.398 26086-26292/com.shevart.fitnessnotes E/RX: threadName pool-1-thread-5 

Почему onNext() вызывается перед call() в карте?

+0

Вы должны добавить дополнительную информацию в свой журнал, чтобы узнать, какой журнал соответствует этому методу. – tynn

ответ

1

Вы хотите наблюдать за основной нитью, а не наоборот.

.subscribeOn(Schedulers.from(executor)) 
.observeOn(AndroidSchedulers.mainThread()) 
1

Позвонив .subscribeOn() вы в основном говорил, что Observable делать свою работу на конкретном Scheduler. С .observeOn(), с другой стороны, вы сообщаете Observable, чтобы отправить вам все уведомления по этой теме.

Итак, вам нужно поменять свою подписку и наблюдать за планировщиками.

.subscribeOn(Schedulers.from(executor)) 
.observeOn(AndroidSchedulers.mainThread()) 
Смежные вопросы