https://gank.io/post/560e15be2dca930e00da1083
線程控制 —— Scheduler
在不指定線程的情況下笼痹, RxJava 遵循的是線程不變的原則笋籽,即:在哪個線程調(diào)用 subscribe(),就在哪個線程生產(chǎn)事件娩贷;在哪個線程生產(chǎn)事件,就在哪個線程消費(fèi)事件锭亏。如果需要切換線程咖城,就需要用到 Scheduler (調(diào)度器)。
種類
- Schedulers.immediate(): 直接在當(dāng)前線程運(yùn)行歪赢,相當(dāng)于不指定線程化戳。這是默認(rèn)的 Scheduler。
- Schedulers.newThread(): 總是啟用新線程埋凯,并在新線程執(zhí)行操作点楼。
- Schedulers.io(): I/O 操作(讀寫文件、讀寫數(shù)據(jù)庫白对、網(wǎng)絡(luò)信息交互等)所使用的 Scheduler掠廓。行為模式和 newThread() 差不多,區(qū)別在于 io() 的內(nèi)部實(shí)現(xiàn)是是用一個無數(shù)量上限的線程池甩恼,可以重用空閑的線程蟀瞧,因此多數(shù)情況下 io() 比 newThread() 更有效率。不要把計(jì)算工作放在 io() 中条摸,可以避免創(chuàng)建不必要的線程悦污。
- Schedulers.computation(): 計(jì)算所使用的 Scheduler。這個計(jì)算指的是 CPU 密集型計(jì)算屈溉,即不會被 I/O 等操作限制性能的操作塞关,例如圖形的計(jì)算。這個 Scheduler 使用的固定的線程池子巾,大小為 CPU 核數(shù)帆赢。不要把 I/O 操作放在 computation() 中,否則 I/O 操作的等待時間會浪費(fèi) CPU线梗。
- 另外椰于, Android 還有一個專用的 AndroidSchedulers.mainThread(),它指定的操作將在 Android 主線程運(yùn)行仪搔。
Observable.just(1, 2, 3, 4)
.subscribeOn(Schedulers.io()) // 指定 subscribe() 發(fā)生在 IO 線程
.observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回調(diào)發(fā)生在主線程
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer number) {
Log.d(tag, "number:" + number);
}
});
RxJava和RxAndroid的不同
- RxAndroid可以理解為一種RxJava的擴(kuò)展瘾婿,可以幫助您輕松地在Android平臺上使用RxJava。
- RxAndroid依賴于RxJava,該模塊為RxJava添加了最小類偏陪,使得在Android應(yīng)用程序中編寫反應(yīng)組件變得簡單而輕松抢呆。更具體地說,它提供了一個調(diào)度程序笛谦,可以在主線程或任何給定的Looper上進(jìn)行調(diào)度抱虐。