前言
最近有點亂,項目忙著上線戚扳,臨近這個時候,項目總會出現(xiàn)各種問題族吻,測試出各種bug帽借,有的沒得一大堆,尤其是出現(xiàn)memory leak問題超歌,關(guān)于memory leak一直想寫篇博客談?wù)勎业南敕嘲@里不多說,咱來接著聊一聊Rxjava的學(xué)習(xí)巍举。
線程控制 —— Scheduler
線程的控制也是Rxjava種很重要的一塊脆荷,Rxjava在設(shè)計上,針對數(shù)據(jù)操作的性質(zhì)作了考慮懊悯,由于不同的操作所需要的線程要求不同蜓谋,這樣就需要 Scheduler(調(diào)度器)。
默認(rèn)情況下的Rxjava是不會對線程進(jìn)行變換的炭分,也就是說桃焕,事件發(fā)生在哪個線程,最終就會運行在哪個線程捧毛。
先來看看Scheduler類 API中提供的線程選擇:
Schedulers.immediate(): 默認(rèn)的 Scheduler观堂,在當(dāng)前線程立即開始執(zhí)行任務(wù)。
Schedulers.newThread(): 為每個任務(wù)創(chuàng)建一個新線程呀忧。
Schedulers.io(): 师痕。用于IO密集型任務(wù),如對文件的讀寫而账、數(shù)據(jù)庫的操作胰坟、網(wǎng)絡(luò)的訪問等,這個調(diào)度器的線程池會根據(jù)需要增長福扬;對于普通的計算任務(wù)腕铸,使用Schedulers.computation()惜犀;Schedulers.io(?)默認(rèn)是一個CachedThreadScheduler,很像一個有線程緩存的新線程調(diào)度器狠裹。
Schedulers.computation(): 計算所使用的 Scheduler虽界。如事件循環(huán)或和回調(diào)處理,不要用于IO操作(IO操作請使用Schedulers.io())涛菠;默認(rèn)線程數(shù)等于處理器的數(shù)量莉御。
另外, 對于Android 還提供一個專用的 AndroidSchedulers.mainThread()俗冻,它指定的操作將在 Android 主線程運行礁叔。
對于android來說,有了以上幾個基本夠用了迄薄,Rxjava提供了subscribeOn() 和 observeOn() 這兩個方法來對線程進(jìn)行控制琅关。
- subscribeOn() :用來指定subscribe()方法發(fā)生的線程,通常 只需調(diào)用一次,位置則隨意讥蔽。
- observeOn():用來指定其接下來的方法的回調(diào)發(fā)生的線程涣易。
舉個例子解釋一下:
Observable.just(1, 2, 3, 4) // IO 線程,由 subscribeOn() 指定
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.newThread())
.map(mapOperator) // 新線程冶伞,由 observeOn() 指定
.observeOn(Schedulers.io())
.map(mapOperator2) // IO 線程新症,由 observeOn() 指定
.observeOn(AndroidSchedulers.mainThread)
.subscribe(subscriber); // Android 主線程,由 observeOn() 指定
由 subscribeOn(Schedulers.io()) 指定 subscribe() 最終將發(fā)生在 io線程中响禽,而observeOn(AndroidSchedulers.mainThread) 則表示 subscriber 的方法將發(fā)生在 主線程 中徒爹。 在來看一下,observeOn(Schedulers.newThread()) 在表示下面的方法 map(mapOperator) 中芋类,mapOperator任務(wù)將 發(fā)生在一個新線程中隆嗅,mapOperator2 發(fā)生在io線程中。