前兩篇文章介紹了RxJava的Single和Subject,想必大家對RxJava已經(jīng)有簡單的認(rèn)識,并且可以寫出異步任處理的具體實現(xiàn)了,本文會介紹Scheduler調(diào)度器的使用。
之前文章中我們有提到過subscribeOn和observeOn兩個方法,他們都接收一個Scheduler參數(shù)做為傳入值列赎。主要作用就是指定異步任務(wù)Obserable和訂閱者Subscribe兩者處理的線程。
下表展示RxJava中常見的調(diào)度器種類:
調(diào)度器類型 | 效果 |
---|---|
Schedulers.computation() | 用于計算任務(wù)镐确,如事件循環(huán)或和回調(diào)處理包吝,不要用于IO操作(IO操作請使用Schedulers.io());默認(rèn)線程數(shù)等于處理器的數(shù)量 |
Schedulers.from(executor) | 使用指定的Executor作為調(diào)度器 |
Schedulers.immediate(?) | 在當(dāng)前線程立即開始執(zhí)行任務(wù) |
Schedulers.io(?) | 用于IO密集型任務(wù)源葫,如異步阻塞IO操作漏策,這個調(diào)度器的線程池會根據(jù)需要增長;對于普通的計算任務(wù)臼氨,請使用Schedulers.computation()掺喻;Schedulers.io(?)默認(rèn)是一個CachedThreadScheduler,很像一個有線程緩存的新線程調(diào)度器 |
Schedulers.newThread(?) | 為每個任務(wù)創(chuàng)建一個新線程 |
Schedulers.trampoline(?) | 當(dāng)其它排隊的任務(wù)完成后储矩,在當(dāng)前線程排隊開始執(zhí)行 |
除了之前我們介紹過的subscribeOn/observeOn會用到Scheduler感耙。在RxJava中還有Worker會用到它。
比如傳統(tǒng)的創(chuàng)建線程:
new Thread(new Runnable() {
@Override
public void run() {
// TODO
}
}).start();
在RxJava中持隧,我們可以這樣實現(xiàn):
Schedulers.newThread().createWorker().schedule(new Action0() {
@Override
public void call() {
// TODO
}
});
這樣的好處是我們可以直接使用RxJava的線程調(diào)度邏輯即硼。并且在合適的時機終止線程
Scheduler.Worker worker = Schedulers.io().createWorker();
worker.schedule(new Action0() {
@Override
public void call() {
// TODO
}
});
worker.unsubscribe();
除此之外,還有個好處是更容易的實現(xiàn)延遲執(zhí)行和周期執(zhí)行:
// 延遲
Schedulers.computation().createWorker().schedule(new Action0() {
@Override
public void call() {
// TODO
}}, 500, TimeUnit.MILLISECONDS);
// 周期
Schedulers.computation().createWorker().schedulePeriodically(new Action0() {
@Override
public void call() {
// TODO
}}, 500, 250, TimeUnit.MILLISECONDS);
總結(jié)
使用Scheduler可以管理訂閱者和被訂閱者的處理線程屡拨,并且通過Scheduler.Worker直接實現(xiàn)線程調(diào)度和延遲周期邏輯只酥。
下篇介紹Observables褥实。