我們知道,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 });