Picasso使用的是門面設(shè)計(jì)模式,Picasso的調(diào)用是從Picasso這個(gè)類中開始的锅劝,Picasso內(nèi)部組件的初始化也是從這個(gè)類中開始的,如果需要自定義Picasso,可以通過(guò)Picasso.with("環(huán)境上下文")來(lái)獲取的Picasso的實(shí)例寨躁。Picasso的實(shí)例使用了單例設(shè)計(jì)模式
Picasso加載圖片使用的是Okhhtp和HttpConnection兩種方式,使用的時(shí)候Picasso通過(guò)反射來(lái)判斷當(dāng)前是否存在Okhttp的依賴包牙勘,如果存在就使用职恳,不存在則使用HttpConnetion來(lái)請(qǐng)求圖片
圖片的存儲(chǔ)路徑是data/data/包名,不同品牌的手機(jī)的該路徑不同所禀,因此 通過(guò)環(huán)境上下文來(lái)來(lái)獲取該路徑this.getCacheDir();通常使用Application來(lái)獲取該路徑放钦。
圖片內(nèi)存中緩存的算法默認(rèn)使用的是LruCache色徘,在內(nèi)存的容量達(dá)到峰值的時(shí)候,默認(rèn)移除最早的緩存
Picasso中存在接受網(wǎng)絡(luò)狀況改變的廣播操禀,因此可以根據(jù)當(dāng)前的網(wǎng)絡(luò)狀況來(lái)來(lái)決定當(dāng)前的線程池中線程的個(gè)數(shù):
網(wǎng)絡(luò)狀況特別好(列入Wifi) 線程池中線程的個(gè)數(shù)為4
網(wǎng)絡(luò)狀況好(4G) 線程池中的線程的個(gè)數(shù)為3
網(wǎng)絡(luò)狀況一般(3G)線程池中線程的個(gè)數(shù)為2褂策;
網(wǎng)絡(luò)狀況不好(2G)線程池中線程的個(gè)數(shù)為1
默認(rèn)狀態(tài)下的線程池中的線程的個(gè)數(shù)為3.
圖片的加載流程:
Picasso通過(guò)with()來(lái)獲取到Picasso的單列,通過(guò)Load()方法封裝了圖片的請(qǐng)求參數(shù)颓屑,例如URl斤寂,圖片的請(qǐng)求參數(shù),圖片請(qǐng)求的優(yōu)先級(jí)等邢锯,通過(guò)該方法后得到的返回的對(duì)象可以用來(lái)設(shè)置圖片的其他參數(shù)扬蕊,例如error時(shí)的圖片,占位圖片等丹擎,最終通過(guò)設(shè)置into()方法來(lái)創(chuàng)建一個(gè)請(qǐng)求尾抑,通過(guò)action把意圖和內(nèi)存策略以及target封裝后,提交給Picasso執(zhí)行類去執(zhí)行蒂培,通過(guò)target來(lái)判斷再愈,target是否已存在action,如果是則pause之前的target,然后Picasso類把任務(wù)的啟動(dòng)交給dispatcher來(lái)執(zhí)行,dispatcher檢查action對(duì)應(yīng)的hunter是否已創(chuàng)建,如果創(chuàng)建則直接將actionattachhunter即可,如果hunter沒有創(chuàng)建則創(chuàng)建hunter并將其提交給線程池執(zhí)行.執(zhí)行完成后通過(guò)在BitmapHunter獲取圖片成功后,會(huì)交由dispatcher.dispatchComplete(this);dispatcher會(huì)將200ms內(nèi)完成的任務(wù)發(fā)送到主線程(這個(gè)主線程handler定義在Picasso類中),在這里有一個(gè)延遲(不知道為什么)主線程收到這個(gè)消息后會(huì)調(diào)用complete方法,action.complete(result, from);會(huì)被調(diào)用,在這個(gè)方法里面會(huì)對(duì)target設(shè)置bitmap(還有些加載動(dòng)畫等設(shè)置护戳,此處不再贅述),至此圖片加載完成翎冲。
圖片加載的詳細(xì)流程
Picasso獲取圖片資源并顯示的代碼流轉(zhuǎn)過(guò)程如下:
Picasso.with()獲取Picasso實(shí)例
.load("url")方法用傳入的url創(chuàng)建一個(gè)RequestCreator對(duì)象
.into(imageview)方法創(chuàng)建此次request并將其封裝進(jìn)action再調(diào)用picasso.enqueueAndSubmit(action)
Picasso類將action對(duì)象交給dispatcher.submit()
dispatcher類根據(jù)action創(chuàng)建bitmapHunter,并將bitmapHunter提交至線程池執(zhí)行
當(dāng)bitmapHunter獲取到圖片資源后,又經(jīng)過(guò)了以下步驟最終顯示在ImageView上
bitmapHunter獲取圖片資源成功,調(diào)用dispatcher.dispatchComplete(this);
dispatcher發(fā)送延遲200ms、msg.what=HUNTER_DELAY_NEXT_BATCH媳荒、攜帶200ms內(nèi)完成的bitmapHunter封裝為一個(gè)list的消息到主線程
主線程收到消息后抗悍,調(diào)用Picasso類的complete方法,解析出bitmapHunter中的action
action的complete方法內(nèi),將bitmap設(shè)置給Imageview