RxJava的基本邏輯

combineLatest操作符的高級使用

http://blog.csdn.net/johnny901114/article/details/61191723

轉載來之 : 泡在網上的日子
盡管很多人了解RxJava的基本邏輯,但是在Observable鏈和操作符究竟運行在哪個線程,仍然會有許多困惑。
首先,讓我們梳理清晰,在RxJava中.subsribeOn( )和.observeOn( )區別:
.subsribeOn( )操作符可以改變Observable應該在哪個調度器上執行任務。

.observeOn( )操作符可以改變Observable將在哪個調度器上發送通知。

另外,你需要知道,默認情況下,鏈上的操作符將會在調用.subsribeOn( )的那個線程上執行任務。

一些例子

  1. 主線程或者 .subscribe( )所在線程
    如果在Android的Activity下onCreate( )方法中,也就是主線程中使用如下代碼:
    Observable.just(1,2,3)
    .subscribe( );

表現會像這樣:


1444103881916533.png
  1. 調用 .subscribeOn( )
    盡管代碼片段在主線程中,但是整個代碼塊將運行在.subscribeOn( )定義的線程上:
    Observable.just(1,2,3)
    .subscribeOn(Schedulers.newThread())
    .subscribe();

表現會像這樣:


1444103947378851.png
  1. 調用 .observeOn( )
    如果你的代碼片段在主線程中,默認情況下Observable的創建是在.subscribeOn( )定義的線程上,但是,調用.observeOn( )之后,余下的代碼將會執行在.observeOn( )所定義的線程上:
    Observable.just(1,2,3)
    .observeOn(Schedulers.newThread())
    .subscribe();
1444103981110613.png
  1. 合并邏輯
    照理合并操作符,放在一起就像這樣:
    Observable.just(1,2,3)
    .subscribeOn(Schedulers.newThread())
    .observeOn(Schedulers.newThread())
    .subscribe();
1444104022734036.png

一些技巧

  1. UI線程運行異常
    Observable.just(1,2,3)
    .subscribeOn(Schedulers.newThread())
    .subscribe(/** 與UI線程相關的邏輯 **//);

很明顯,這是錯誤噠。

  1. 保證邏輯運行在工作線程中
    如果存在以下代碼片段:
    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( )。

  1. 取決于更早的 .subscribeOn( )
    以下代碼:
    Observable.just(1,2,3)
    .subscribeOn(thread1)
    .subscribeOn(thread2)
    .subscribe();

因為thread1的邏輯將會覆蓋thread2,所以Observable的創建和.subscribe( )的邏輯處理都將運行在thread1中。因此,根本沒有必要寫多個.subscribeOn( )操作符。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容