glide全局是一個單例的存在尺迂,利用with()方法根據(jù)傳遞的context與界面關(guān)聯(lián)感知生命周期谴垫,如果在非主線程中執(zhí)行g(shù)lide操作,會傳入一個application的context對象刽辙,感知的生命周期是整個程序的周期旬渠。
在主線程中税课,如果傳入的是activity的context闲延,由于glide感知到不到activity的生命周期會在當(dāng)前的activity中生成一個隱藏的fragment來與當(dāng)前界面進(jìn)行生命周期的綁定。當(dāng)然傳入的是fragment的話韩玩,就不用新建這個隱藏的fragment.
問題:在recyclerview中垒玲,每個item有一個glide加載圖片的問題,每次glide加載圖片會異步利用線程池開啟一個訪問找颓,但是當(dāng)用戶在滑動是合愈,復(fù)用的item并沒有加載上次異步的請求網(wǎng)絡(luò)緩慢導(dǎo)致的圖片混亂問題,怎么理解?
原因:Glide將加載請求和Target(ImageView)關(guān)聯(lián)佛析,開始某個ImageView的加載請求前會先將該ImageView關(guān)聯(lián)的請求清除益老。此時在線程池中的關(guān)聯(lián)的DecodeJob,正在進(jìn)行的網(wǎng)絡(luò)請求不會被中斷寸莫,在等待隊列里的也不會被直接從線程池移除捺萌,而是移除回調(diào)并設(shè)置取消標(biāo)志位,讓未開始的后續(xù)加載步驟的邏輯不會被執(zhí)行膘茎。
當(dāng)列表(ListView/RecyclerView)快速滾動時桃纯,同時執(zhí)行的網(wǎng)絡(luò)請求數(shù)量不會超過設(shè)備可用核心數(shù),其余請求會放到隊列中等待執(zhí)行披坏。雖然隊列長度可能會一下增加到幾十态坦,但隨著列表復(fù)用View,隊列中的大部分請求都會被取消掉棒拂,之后執(zhí)行時不會發(fā)起網(wǎng)絡(luò)請求伞梯,并迅速讓位于等待中的請求。也就是說帚屉,快速滾動過程的中間很多個列表項的請求都會被略過壮锻。這樣的機制保證了不會過度消耗資源導(dǎo)致滑動卡頓與圖片混亂問題