我有這樣的代碼管理線程調度service
- >dao
- >api
。方法api.getUserById(id)
進行網絡呼叫。時CONCAT可觀測量
我得到NetworkOnMainThreadException
錯誤。爲什麼?我正在使用和subscribeOn
和observeOn
運算符,但它似乎不適用於「最終」構建的Observable。
如果我在API調用使用該運營商,在DAO,它的工作原理:
有沒有到剛剛在「根」,一旦使用方式可觀察?
我有這樣的代碼管理線程調度service
- >dao
- >api
。方法api.getUserById(id)
進行網絡呼叫。時CONCAT可觀測量
我得到NetworkOnMainThreadException
錯誤。爲什麼?我正在使用和subscribeOn
和observeOn
運算符,但它似乎不適用於「最終」構建的Observable。
如果我在API調用使用該運營商,在DAO,它的工作原理:
有沒有到剛剛在「根」,一旦使用方式可觀察?
因此,concatMap
訂閱Observables。什麼線程用於執行此操作?那麼,concatMat
線程調用onNext
,因爲它不會更改線程/調度程序。所以,一個簡單的換位應該幫助這個:
service.getUserById(10)
.subscribeOn(Schedulers.newThread())
.concatMap(getFullUserFromDto())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(doSomehingWithUser());
我也建議使用Schedulers.io(),因爲它會重新使用線程。
簡短的回答:使用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
那麼,爲什麼我會得到NetworkOnMainThreadException? –
不想成爲Captain明顯,但是因爲你在主線程上執行網絡操作,在'AndroidSchedulers.mainThread()'中。我想你可以通過打印出當前線程Thread.currentThread()來調試你的代碼,這應該能夠更深入地瞭解正在發生的事情 – Entea
你的錯誤出現在'api.getUserById(id)'中,你可以通過'api.getUserById(id).subscribeOn(Schedulers.io())'來修復它,這意味着**你應該包含你的'api .getUserById()'** – EpicPandaForce