1. 程式人生 > >retrofit 有關執行緒排程器

retrofit 有關執行緒排程器

執行緒排程器

Scheduler(執行緒排程器)賦予RxJava簡潔明瞭的非同步操作,可以說是RxJava中最值得稱道的地方。
Observable發射資料流,Observer接收響應資料流,以及Operators加工資料流均是在同一個執行緒中,實現出來的是一個同步的函式響應式。但是函式響應式的實際應用卻不是這樣的,大部分都是後臺處理,前臺響應的一個過程。Observable生成發射資料流,以及Operators加工資料流都是在後臺執行緒中進行,而Observer在前臺執行緒中接受並相應資料。
Scheduler(執行緒排程器)可以讓RxJava的執行緒切換變得簡單明瞭,即使程式邏輯變得十分複雜,他依然能夠保持簡單明瞭。

subscribeOn

Observable<T> subscribeOn(Scheduler scheduler) 

subscribeOn通過接收一個Scheduler引數,來指定對資料的處理執行在特定的執行緒排程器Scheduler上。
若多次設定,則只有一次起作用。

observeOn

Observable<T> observeOn(Scheduler scheduler)

observeOn同樣接收一個Scheduler引數,來指定下游操作執行在特定的執行緒排程器Scheduler上。
若多次設定,每次均起作用。

Scheduler種類

Schedulers.io( ):
用於IO密集型的操作,例如讀寫SD卡檔案,查詢資料庫,訪問網路等,具有執行緒快取機制,在此排程器接收到任務後,先檢查執行緒快取池中,是否有空閒的執行緒,如果有,則複用,如果沒有則建立新的執行緒,並加入到執行緒池中,如果每次都沒有空閒執行緒使用,可以無上限的建立新執行緒。

Schedulers.newThread( ):
在每執行一個任務時建立一個新的執行緒,不具有執行緒快取機制,因為建立一個新的執行緒比複用一個執行緒更耗時耗力,雖然使用Schedulers.io( )的地方,都可以使用Schedulers.newThread( ),但是,Schedulers.newThread( )

的效率沒有Schedulers.io( )高。

Schedulers.computation():
用於CPU 密集型計算任務,即不會被 I/O 等操作限制性能的耗時操作,例如xml,json檔案的解析,Bitmap圖片的壓縮取樣等,具有固定的執行緒池,大小為CPU的核數。不可以用於I/O操作,因為I/O操作的等待時間會浪費CPU。

Schedulers.trampoline():
在當前執行緒立即執行任務,如果當前執行緒有任務在執行,則會將其暫停,等插入進來的任務執行完之後,再將未完成的任務接著執行。

Schedulers.single():
擁有一個執行緒單例,所有的任務都在這一個執行緒中執行,當此執行緒中有任務執行時,其他任務將會按照先進先出的順序依次執行。

Scheduler.from(@NonNull Executor executor):
指定一個執行緒排程器,由此排程器來控制任務的執行策略。

AndroidSchedulers.mainThread():
在Android UI執行緒中執行任務,為Android開發定製。

注:
在RxJava2中,廢棄了RxJava1中的Schedulers.immediate( )
在RxJava1中,Schedulers.immediate( )的作用為在當前執行緒立即執行任務,功能等同於RxJava2中的Schedulers.trampoline( )。
而Schedulers.trampoline( )在RxJava1中的作用是當其它排隊的任務完成後,在當前執行緒排隊開始執行接到的任務,有點像RxJava2中的Schedulers.single(),但也不完全相同,因為Schedulers.single()不是在當前執行緒而是在一個執行緒單例中排隊執行任務。