我們知道,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的消息/事件傳遞功能