1.Scheduler 的 API
在響應(yīng)式編程中,如果想給Observable操作符鏈添加多線程功能,可以指定操作符(或者特定的Observable)在特定的調(diào)度器(Scheduler)上執(zhí)行。
RxJava提供了5種調(diào)度器:
Schedulers.immediate():這個調(diào)度器允許立即在當(dāng)前線程執(zhí)行所指定的工作。它是默認(rèn)的調(diào)度器。
Schedulers.newThread():總是啟用新線程,并在新線程執(zhí)行操作。
Schedulers.io():這個調(diào)度器適用于I/O操作。它基于根據(jù)需要,增長或縮減來自適應(yīng)的線程池。因此多數(shù)情況下?io()?比?newThread()?更有效率。不要把計算工作放在?io()?中,可以避免創(chuàng)建不必要的線程。
Schedulers.computation():這個是計算工作默認(rèn)的調(diào)度器,這個計算指的是 CPU 密集型計算,即不會被 I/O 等操作限制性能的操作。這個?Scheduler?使用的固定的線程池,大小為 CPU 核數(shù)。不要把 I/O 操作放在?computation()?中,否則 I/O 操作的等待時間會浪費(fèi) CPU。
Schedulers.trampoline():當(dāng)我們想在當(dāng)前線程執(zhí)行一個任務(wù)時,并不是立即,我們可以用.trampoline()將它入隊。這個調(diào)度器將會處理它的隊列并且按序運(yùn)行隊列中每一個任務(wù)。
補(bǔ)充:Android 還有一個專用的?AndroidSchedulers.mainThread(),它指定的操作將在 Android 主線程運(yùn)行。
那么如何進(jìn)行線程調(diào)度呢?
可以使用ObserveOn()和subscribeOn()操作符,讓Observable在一個特定的調(diào)度器上執(zhí)行。
subscribeOn():?指定?subscribe()所發(fā)生的線程,即?Observable.OnSubscribe?被激活時所處的線程?;蛘呓凶鍪录a(chǎn)生的線程。
observeOn():?指定?Subscriber?所運(yùn)行在的線程?;蛘呓凶鍪录M(fèi)的線程。
2.舉個栗子(代碼演示)
通過url從網(wǎng)絡(luò)上獲取一張圖片,并顯示在imageView中。網(wǎng)絡(luò)請求是消耗時間長,需要放在后臺線程,更新UI需要在主線程執(zhí)行。
Observable.getBitmapFromNet(url).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(bitmap->imageView.setImageBitmap(bitmap));
補(bǔ)充:Scheduler切換線程中,通過?observeOn()?的多次調(diào)用,程序可以在線程間多次切換。而subscribeOn()?只能調(diào)用一次的,它可以放在任何位置。