RxJava之Schedulers
Schedulers是RxJava的主要元件之一。它們負責在不同執行緒上執行Observables的操作。它們便於將耗時任務分攤到其他執行緒。本文將會學習下排程器的型別和使用場景。
IO
最常見的排程器之一。它們用於IO相關操作。比如網路請求和檔案操作。IO 排程器背後由執行緒池支撐。
它首先建立一個工作執行緒,可以複用於其他操作。當然,當這個工作執行緒(長時間任務的情況)不能被複用時,會建立一個新的執行緒來處理其他操作。這個好處也會帶來一些問題,因為允許建立的執行緒是無限的,所以當建立大量執行緒的時候,會對整體效能造成一些影響。不過IO排程器仍然不失為一個好用的排程器。使用如下:
observable.subscribeOn(Schedulers.io())
Computation
這個排程器和IO排程器非常相似,因其也是由執行緒池支援的。然鵝,可可用的執行緒數是固定的,和系統的cpu核數目保持一致。所以如果你的手機是雙核的,那麼執行緒池中就有兩個執行緒。這也意味著如果這兩條執行緒都處於忙碌狀態,那麼該程序將會等待執行緒變成空閒狀態的時候才能處理其他操作。因為這個限制,它不太適合IO相關操作。適用於進行一些計算操作,計算速度還很快。使用如下:
observable.subscribeOn(Schedulers.newThread())
Single
此款排程器非常簡單,由一個執行緒支援。所以無論有多少個observables,都將只執行在這個執行緒上。也可將其認為是主執行緒的一個替代,使用如下:
observable.subscribeOn(Schedulers.single())
Immediate
此款排程器在當前活躍執行緒以阻塞的方式開始其任務(rxjava2已將其移除),無視當前執行的任務。使用如下:
observable.subscribeOn(Schedulers.immediate())
Trampoline
此款排程器執行在當前執行緒,所以如果你有程式碼執行在主執行緒上,它會將將要執行的程式碼塊新增到主執行緒的佇列。和Immediate非常相似,不同的是Immediate會阻塞此執行緒,而Trampoline會等待當前任務執行完成。適用用於不止一個observables,並且希望他們能夠按照順序執行的場景。
Observable.just(1,2,3,4) .subscribeOn(Schedulers.trampoline()) .subscribe(onNext); Observable.just( 5,6, 7,8, 9) .subscribeOn(Schedulers.trampoline()) .subscribe(onNext); Output: Number = 1 Number = 2 Number = 3 Number = 4 Number = 5 Number = 6 Number = 7 Number = 8 Number = 9
使用如下:
observable.subscribeOn(Schedulers.trampoline())
Executor Scheduler
更像是一種自定義的IO排程器。我們可以通過制定執行緒池的大小來建立一個自定義的執行緒池。適用於observables的數量對於IO排程器太多的場景使用,使用如下:
val executor = Executors.newFixedThreadPool(10) val pooledScheduler = Schedulers.from(executor)
Android Scheduler
由rxAndroid庫提供,用於將操作切換到主執行緒以便操作ui,經常用於observeOn方法。使用如下:
AndroidSchedulers.mainThread()