2016-08-20 94 views
0

我有這樣的代碼管理線程調度service - >dao - >api。方法api.getUserById(id)進行網絡呼叫。時CONCAT可觀測量

我得到NetworkOnMainThreadException錯誤。爲什麼?我正在使用和subscribeOnobserveOn運算符,但它似乎不適用於「最終」構建的Observable。

如果我在API調用使用該運營商,在DAO,它的工作原理:

​​

有沒有到剛剛在「根」,一旦使用方式可觀察?

+0

你的錯誤出現在'api.getUserById(id)'中,你可以通過'api.getUserById(id).subscribeOn(Schedulers.io())'來修復它,這意味着**你應該包含你的'api .getUserById()'** – EpicPandaForce

回答

1

因此,concatMap訂閱Observables。什麼線程用於執行此操作?那麼,concatMat線程調用onNext,因爲它不會更改線程/調度程序。所以,一個簡單的換位應該幫助這個:

service.getUserById(10) 
    .subscribeOn(Schedulers.newThread()) 
    .concatMap(getFullUserFromDto()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(doSomehingWithUser()); 

我也建議使用Schedulers.io(),因爲它會重新使用線程。

0

簡短的回答:使用observeOn鏈式操作之前CONTROLL上調度它們執行:

service.getUserById(10) 
    .subscribeOn(Schedulers.newThread()) 
    .observeOn(Schedulers.io()) 
    .concatMap(getFullUserFromDto()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(doSomehingWithUser()); 

在上面的例子中,.concatMap將在Schedulers.io()

更多細節執行可以在這裏找到: http://tomstechnicalblog.blogspot.com/2016/02/rxjava-understanding-observeon-and.html

+0

那麼,爲什麼我會得到NetworkOnMainThreadException? –

+0

不想成爲Captain明顯,但是因爲你在主線程上執行網絡操作,在'AndroidSchedulers.mainThread()'中。我想你可以通過打印出當前線程Thread.currentThread()來調試你的代碼,這應該能夠更深入地瞭解正在發生的事情 – Entea