http://blog.csdn.net/johnny901114/article/details/61191723
轉載來之 : 泡在網上的日子
盡管很多人了解RxJava的基本邏輯,但是在Observable鏈和操作符究竟運行在哪個線程,仍然會有許多困惑。
首先,讓我們梳理清晰,在RxJava中.subsribeOn( )和.observeOn( )區別:
.subsribeOn( )操作符可以改變Observable應該在哪個調度器上執行任務。
.observeOn( )操作符可以改變Observable將在哪個調度器上發送通知。
另外,你需要知道,默認情況下,鏈上的操作符將會在調用.subsribeOn( )的那個線程上執行任務。
一些例子
- 主線程或者 .subscribe( )所在線程
如果在Android的Activity下onCreate( )方法中,也就是主線程中使用如下代碼:
Observable.just(1,2,3)
.subscribe( );
表現會像這樣:
- 調用 .subscribeOn( )
盡管代碼片段在主線程中,但是整個代碼塊將運行在.subscribeOn( )定義的線程上:
Observable.just(1,2,3)
.subscribeOn(Schedulers.newThread())
.subscribe();
表現會像這樣:
- 調用 .observeOn( )
如果你的代碼片段在主線程中,默認情況下Observable的創建是在.subscribeOn( )定義的線程上,但是,調用.observeOn( )之后,余下的代碼將會執行在.observeOn( )所定義的線程上:
Observable.just(1,2,3)
.observeOn(Schedulers.newThread())
.subscribe();
- 合并邏輯
照理合并操作符,放在一起就像這樣:
Observable.just(1,2,3)
.subscribeOn(Schedulers.newThread())
.observeOn(Schedulers.newThread())
.subscribe();
一些技巧
- UI線程運行異常
Observable.just(1,2,3)
.subscribeOn(Schedulers.newThread())
.subscribe(/** 與UI線程相關的邏輯 **//);
很明顯,這是錯誤噠。
- 保證邏輯運行在工作線程中
如果存在以下代碼片段:
Observable.just(1,2,3)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(/** 與UI線程無關的邏輯**//)
.subscribe();
請用以下代碼替代:
Observable.just(1,2,3)
.subscribeOn(Schedulers.newThread())
.flatMap(/** 與UI線程無關的邏輯**//)
.observeOn(AndroidSchedulers.mainThread())
.subscribe();
通過用第二段代碼代替第一段,.flatMap( )操作符(或者在這一點的其他邏輯操作符)將運行在后臺線程。這樣做就不會阻塞UI線程,同時可以防患ANR或其他類似問題的發生。看起來有點像AsyncTask模式,盡可能的把邏輯放在的.doInBackground( )中,而不是.onPostExecute( )。
- 取決于更早的 .subscribeOn( )
以下代碼:
Observable.just(1,2,3)
.subscribeOn(thread1)
.subscribeOn(thread2)
.subscribe();
因為thread1的邏輯將會覆蓋thread2,所以Observable的創建和.subscribe( )的邏輯處理都將運行在thread1中。因此,根本沒有必要寫多個.subscribeOn( )操作符。