RxJava 1.x 理解-2

給RxJava 加入線程控制 -- Scheduler

在 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。
  • 另外, Android 還有一個專用的 AndroidSchedulers.mainThread(),它指定的操做將在 Android 主線程運行。

有了這幾個 Scheduler ,就可使用 subscribeOn() 和 observeOn() 兩個方法來對線程進行控制了。 * subscribeOn(): 指定 subscribe() 所發生的線程,即 Observable.OnSubscribe 被激活時所處的線程。或者叫作事件產生的線程。 * observeOn(): 指定 Subscriber 所運行在的線程。或者叫作事件消費的線程。post

 

參考資料:性能

一塊兒來造一個RxJava,揭祕RxJava的實現原理url

給 Android 開發者的 RxJava 詳解spa

相關文章
相關標籤/搜索