天天看點

Rxjava學習(三線程排程器Scheduler)

   我們知道,RxJava最主要的特點就是異步操作,它的異步操作就是用Scheduler來指定Observable和Subscriber所運作的線程,在默

認情況下,即在不指定線程的情況下,RxJava遵循的是線程不變的原則,即:在哪個線程生産事件,就在哪個線程消費事件

Schedulers線程排程器

我們來看一下Schedulers的分類:

(1)Schedulers.immediate():預設的Scheduler。即在哪個線程生産事件,就在哪個線程消費事件

(2)Schedulers.newThread():總是啟用新線程,并在新線程執行操作。

(3)Schedulers.io(): I/O 操作(讀寫檔案、讀寫資料庫、網絡資訊互動等)所使用的Scheduler。

  行為模式和newThread()差不多,差別在于io()的内部實作是是用一個無數量上限的線程池,可以重用空閑的線程,

  是以多數情況下 io() 比 newThread() 更有效率。不要把計算工作放在 io() 中,可以避免建立不必要的線程。

(4)Schedulers.computation(): 計算所使用的Scheduler。這個計算指的是 CPU 密集型計算,即不會被I/O等操作限制

  性能的操作,例如圖形的計算。這個Scheduler使用的固定的線程池,大小為 CPU 核數。不要把 I/O 操作放在 computation()

  中,否則I/O操作的等待時間會浪費CPU。

(5)另外,RxAndroid 還有一個專用的 AndroidSchedulers.mainThread(),它指定的操作将在 Android 主線程運作。  

Observable.create(new Observable.OnSubscribe<Integer>(){
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                //背景線程取資料
            }
        }).subscribeOn(Schedulers.io()) //指定事件産生的線程,Observable的方法所在的線程
          .observeOn(AndroidSchedulers.mainThread()) //指定事件消費的線程,即Subscriber所運作在的線程
          .subscribe(new Action1<Integer>() {
              @Override
              public void call(Integer integer) {
                 //主線程顯示資料
              }
          });
           

如何實作線程的多次控制呢?我們來看一下下面的代碼

Observable.just(R.mipmap.ic_launcher).subscribeOn(Schedulers.io())//指定Observable的操作運作在io()中
                .observeOn(Schedulers.newThread())//指定map運作于newThread()中
                .map(new Func1<Integer, Drawable>() {
                    @Override
                    public Drawable call(Integer integer) {
                        return getResources().getDrawable(integer);
                    }
                }).observeOn(AndroidSchedulers.mainThread())//指定Subscriber的代碼運作在主線程
                .subscribe(new Action1<Drawable>() {

                    @Override
                    public void call(Drawable drawable) {
                        iv_iamgeview.setImageDrawable(drawable);
                    }
                });
           

RxJava的使用差不多就這麼多,下一章自己将用Rxjava來實作RxBus實作EventBus的消息/事件傳遞功能