RxJava其實就是擴(kuò)展的觀察者模式哼拔。
四個基本概念:
Observer (觀察者):決定事件觸發(fā)時有什么樣的具體反應(yīng);
Observable (可觀察者,即被觀察者):它決定什么時候觸發(fā)事件以及觸發(fā)怎樣的事件;
subscribe(訂閱),事件导而。
四者的關(guān)系為:
Observable 和 Observer 通過 subscribe() 方法實現(xiàn)訂閱關(guān)系忱叭,從而 Observable 可以在需要的時候發(fā)出事件來通知 Observer。
Scheduler
調(diào)度器今艺,相當(dāng)于線程控制器韵丑。
RxJava 通過它來指定每一段代碼應(yīng)該運行在什么樣的線程。RxJava 已經(jīng)內(nèi)置了幾個 Scheduler 虚缎,它們已經(jīng)適合大多數(shù)的使用場景:
Schedulers.immediate(): 直接在當(dāng)前線程運行撵彻,相當(dāng)于不指定線程。這是默認(rèn)的 Scheduler实牡。
Schedulers.newThread(): 總是啟用新線程陌僵,并在新線程執(zhí)行操作。
Schedulers.io(): I/O 操作(讀寫文件创坞、讀寫數(shù)據(jù)庫碗短、網(wǎng)絡(luò)信息交互等)所使用的 Scheduler。行為模式和 newThread() 差不多题涨,區(qū)別在于 io() 的內(nèi)部實現(xiàn)是是用一個無數(shù)量上限的線程池偎谁,可以重用空閑的線程总滩,因此多數(shù)情況下 io() 比 newThread() 更有效率。不要把計算工作放在 io() 中巡雨,可以避免創(chuàng)建不必要的線程闰渔。
Schedulers.computation(): 計算所使用的 Scheduler。這個計算指的是 CPU 密集型計算铐望,即不會被 I/O 等操作限制性能的操作冈涧,例如圖形的計算。這個 Scheduler 使用的固定的線程池正蛙,大小為 CPU 核數(shù)督弓。不要把 I/O 操作放在 computation() 中,否則 I/O 操作的等待時間會浪費 CPU跟畅。
另外咽筋, Android 還有一個專用的 AndroidSchedulers.mainThread(),它指定的操作將在 Android 主線程運行徊件。
有了這幾個 Scheduler 奸攻,就可以使用 subscribeOn() 和 observeOn() 兩個方法來對線程進(jìn)行控制了。
subscribeOn(): 指定 subscribe() 所發(fā)生的線程虱痕,即 Observable.OnSubscribe 被激活時所處的線程睹耐。或者叫做事件產(chǎn)生的線程部翘。
observeOn(): 指定 Subscriber 所運行在的線程硝训。或者叫做事件消費的線程新思。