2016-12-02 31 views
0

我開始爲Android學習Rx,並且出現一個錯誤。這是我的代碼: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 

爲什麼地圖call()之前調用onNext()

+0

您應該在日誌中添加更多信息以知道哪個日誌與哪種方法匹配。 – tynn

回答

1

你想觀察主線程,而不是周圍的其他方式。

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

通過調用.subscribeOn()你基本上告知Observable做在一個特定的Scheduler工作。另一方面,您通過.observeOn()告訴Observable向您發送該線程中的所有通知。

所以你需要交換你的訂閱和觀察調度。

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