在 RxJava 1.x 理解-1 中,咱們說到了RxJava的簡單用法,可是這還遠遠不夠,由於這簡單用法是在同一個線程中使用的。好比咱們須要在子線程中進行耗時操做,在Android 主線程中進行UI操做,這樣纔不會致使卡頓的發生。html
先上代碼:java
Observable .create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("提供數據01 獲取線程id:" + Thread.currentThread().getId()); subscriber.onNext("提供數據02 獲取線程id:" + Thread.currentThread().getId()); subscriber.onNext("提供數據03 獲取線程id:" + Thread.currentThread().getId()); subscriber.onNext("提供數據04 獲取線程id:" + Thread.currentThread().getId()); } }) .subscribeOn(Schedulers.io()) // 訂閱發生在 // 指定 subscribe() 發生在 IO 線程 .observeOn(AndroidSchedulers.mainThread()) // 觀察發生在 // 指定 Subscriber 的回調發生在主線程 .subscribe(new Action1<String>() { @Override public void call(String s) { Log.d(TAG, "Item: " + s + " 執行調用 獲取線程id:" + Thread.currentThread().getId()); } });
輸入的結果:數據庫
02-08 22:19:04.212 6071-6071/pers.bolin.rxjavademo D/MainActivity: Item: 提供數據01 獲取線程id:6091 / 執行調用 獲取線程id:2 02-08 22:19:04.212 6071-6071/pers.bolin.rxjavademo D/MainActivity: Item: 提供數據02 獲取線程id:6091 / 執行調用 獲取線程id:2 02-08 22:19:04.212 6071-6071/pers.bolin.rxjavademo D/MainActivity: Item: 提供數據03 獲取線程id:6091 / 執行調用 獲取線程id:2 02-08 22:19:04.212 6071-6071/pers.bolin.rxjavademo D/MainActivity: Item: 提供數據04 獲取線程id:6091 / 執行調用 獲取線程id:2
能夠看出提供數據的事件發生在IO線程中,而回調的事件發生在主線程中了。網絡
在RxJava 中,Scheduler
——調度器,至關於線程控制器,RxJava 經過它來指定每一段代碼應該運行在什麼樣的線程。RxJava 已經內置了幾個 Scheduler
,它們已經適合大多數的使用場景:ide
Schedulers.immediate()
: 直接在當前線程運行,至關於不指定線程。這是默認的 Scheduler
。Schedulers.newThread()
: 老是啓用新線程,並在新線程執行操做。Schedulers.io()
: I/O 操做(讀寫文件、讀寫數據庫、網絡信息交互等)所使用的 Scheduler
。行爲模式和 newThread()
差很少,區別在於 io()
的內部實現是是用一個無數量上限的線程池,能夠重用空閒的線程,所以多數狀況下 io()
比 newThread()
更有效率。不要把計算工做放在 io()
中,能夠避免建立沒必要要的線程。Schedulers.computation()
: 計算所使用的 Scheduler
。這個計算指的是 CPU 密集型計算,即不會被 I/O 等操做限制性能的操做,例如圖形的計算。這個 Scheduler
使用的固定的線程池,大小爲 CPU 核數。不要把 I/O 操做放在 computation()
中,不然 I/O 操做的等待時間會浪費 CPU。AndroidSchedulers.mainThread()
,它指定的操做將在 Android 主線程運行。有了這幾個 Scheduler
,就可使用 subscribeOn()
和 observeOn()
兩個方法來對線程進行控制了。 * subscribeOn()
: 指定 subscribe()
所發生的線程,即 Observable.OnSubscribe
被激活時所處的線程。或者叫作事件產生的線程。 * observeOn()
: 指定 Subscriber
所運行在的線程。或者叫作事件消費的線程。post
參考資料:性能