2016-10-03 31 views
6

我是新來rxJava/Android和驚訝,我onError拉姆達有時也被稱爲主線程上,有時不是,雖然我用.observeOn(AndroidSchedulers.mainThread())如何處理RxAndroid錯誤在主線程

例1onError在主線程
此按預期工作:onError被稱爲主線程上

Observable.error(new RuntimeException("RTE")) 
    .subscribeOn(Schedulers.newThread()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(s -> { 
       Log.e(TAG, "onNext("+s+")-thread: " + Thread.currentThread().getName()); 
      }, 
      throwable -> { 
       Log.e(TAG, "onError()-thread: " + Thread.currentThread().getName()); 
      }); 

日誌輸出:

onError()-thread: main 

例2onError不是在主線程

Observable.create(new Observable.OnSubscribe<String>() { 
    @Override 
    public void call(Subscriber<? super String> subscriber) { 
     subscriber.onNext("one and only"); 
    } 
}) 
.subscribeOn(Schedulers.newThread()) 
.observeOn(AndroidSchedulers.mainThread()) 
.timeout(1, TimeUnit.SECONDS) 
.subscribe(s -> { 
     Log.e(TAG, "onNext("+s+")-thread: " + Thread.currentThread().getName()); 
    }, 
    throwable -> { 
     Log.e(TAG, "onError()-thread: " + Thread.currentThread().getName()); 
    }); 

輸出是這樣的:

onNext(one and only)-thread: main 
onError()-thread: RxComputationScheduler-4  

我認爲叫observeOn(AndroidSchedulers.mainThread())後,所有排放應在主線程上完成。

,所以我有以下問題:

  1. 我找不到那在什麼情況下onError被稱爲在哪個線程指定的任何文件。任何人都知道鏈接?
  2. 我當然想在GUI中顯示一些錯誤指示:那麼我如何強制onError總是在主線程中調用?

回答

5

我剛發現我只需要改變通話的順序。當我timeout調用後observeOn它按預期工作:

.timeout(1, TimeUnit.SECONDS) 
.observeOn(AndroidSchedulers.mainThread()) 

日誌輸出

onNext(one and only)-thread: main 
onError()-thread: main 

的原因是,observeOn只會影響通話下面的一切,只有等到其他一些運營商改變再次線程。在上面的例子中,timeout()將更改爲計算線程。

請注意,subscribeOn的工作方式不同。它在你稱之爲鏈的哪個地方並不重要。
您應該只調用一次(在第一次調用勝利,當你調用它多次:看「多subscribeOn」這個Blog

這裏是一個不錯的博客,後有更多的細節:RxJava- Understanding observeOn() and subscribeOn()

2

因爲.timeout(1, TimeUnit.SECONDS)默認操作Schedulers.computation()

+0

但[observeOn()](http://reactivex.io/documentation/operators/observeon.html)應該覆蓋該默認值,對吧? – TmTron