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 主線程運行。

 1 Observable.create(new Observable.OnSubscribe<Integer>(){
 2             @Override
 3             public void call(Subscriber<? super Integer> subscriber) {
 4                 //后台線程取數據
 5             }
 6         }).subscribeOn(Schedulers.io()) //指定事件產生的線程,Observable的方法所在的線程
 7           .observeOn(AndroidSchedulers.mainThread()) //指定事件消費的線程,即Subscriber所運行在的線程
 8           .subscribe(new Action1<Integer>() {
 9               @Override
10               public void call(Integer integer) {
11                  //主線程顯示數據
12               }
13           });

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

 1 Observable.just(R.mipmap.ic_launcher).subscribeOn(Schedulers.io())//指定Observable的操作運行在io()中
 2                 .observeOn(Schedulers.newThread())//指定map運行於newThread()中
 3                 .map(new Func1<Integer, Drawable>() {
 4                     @Override
 5                     public Drawable call(Integer integer) {
 6                         return getResources().getDrawable(integer);
 7                     }
 8                 }).observeOn(AndroidSchedulers.mainThread())//指定Subscriber的代碼運行在主線程
 9                 .subscribe(new Action1<Drawable>() {
10  
11                     @Override
12                     public void call(Drawable drawable) {
13                         iv_iamgeview.setImageDrawable(drawable);
14                     }
15                 });

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM