Fresco是一個強(qiáng)大的圖片加載庫渠旁,想必我等碼農(nóng)都有使用過和了解比勉,fresco官網(wǎng)缚甩。之前app端做過這樣一個優(yōu)化根據(jù)用戶手機(jī)的網(wǎng)絡(luò)環(huán)境加載對應(yīng)的清晰度的圖片艺谆,一來是提升用戶體驗加載快屎债,二來節(jié)省用戶的流量畢竟我們的國外用戶流量很貴的仅政。然后功能我們實現(xiàn)了,不同網(wǎng)絡(luò)環(huán)境請求不同的圖片對應(yīng)不同的URL盆驹。
--在此基礎(chǔ)上領(lǐng)導(dǎo)提出個新需求圆丹,當(dāng)在流量環(huán)境下如果有Wi-Fi高清圖片的緩存,就使用高清緩存的圖片躯喇,不再去請求低分辨率的圖片辫封。fresco的三級緩存策略的前提條件是唯一的URL確定某一張圖片硝枉。而領(lǐng)導(dǎo)的要求想當(dāng)如URL_a的請求使用URL_b的緩存。
嘗試一:setFirstAvailableImageRequests 方式倦微。
查閱fresco文檔發(fā)現(xiàn)有【多圖請求及圖片復(fù)用】介紹妻味,里面的【加載最先可用的圖】小段講的小事例是圖片上傳,本地圖片和網(wǎng)絡(luò)下載圖片使用該方法欣福,我們的場景這個似乎可以也適用责球。
Uri uri1, uri2;
ImageRequest request1 = ImageRequest.fromUri(uri1);
ImageRequest request2 = ImageRequest.fromUri(uri2);
ImageRequest[] requests = { request1, request2 };
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setFirstAvailableImageRequests(requests)
.setOldController(mSimpleDraweeView.getController())
.build();
mSimpleDraweeView.setController(controller);
可事實我斷點測試的結(jié)果卻非文檔所講,有小概率會會達(dá)到期望洗過拓劝〕猓可大多時候是先使用request1請求的圖片,及時是有request2的緩存圖片郑临,request1需要網(wǎng)絡(luò)請求下載圖片的栖博。
嘗試二:代碼中判斷是否存在Wi-Fi高清圖片緩存。
if (NetWorkHelper.netWorkState != NetWorkHelper.kNetWorkWIFI && PreferenceUtil.getBool(App.getInstance(), PreferenceUtil.BOOL_NETWORK_GETING_IMAGE, false)) {
//非Wi-Fi環(huán)境下牧抵,原則上選擇當(dāng)前網(wǎng)絡(luò)環(huán)境的壓縮圖片笛匙。但當(dāng)存在Wi-Fi環(huán)境下的高清圖緩存時候,使用Wi-Fi高清圖犀变。無則重新下載
boolean isCacheInDisk = Fresco.getImagePipelineFactory().getMainBufferedDiskCache
().containsSync(new SimpleCacheKey(url));
boolean isCacheInFile = Fresco.getImagePipelineFactory().getMainFileCache()
.hasKey(new SimpleCacheKey(url));
ImageRequest request;
if (isCacheInDisk || isCacheInFile) {
request = ImageRequest.fromUri(uri);
} else {
request = ImageRequest.fromUri(Uri.parse(formatUrl(uri.toString(), getWidth(), getHeight())));
}
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setImageRequest(request)
.setCallerContext(callerContext)
.setOldController(getController())
.build();
setController(controller);
} else {
//Wi-Fi環(huán)境下選擇高清大圖
ImageRequest request2 = ImageRequest.fromUri(uri);
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setImageRequest(request2)
.setCallerContext(callerContext)
.setOldController(getController())
.build();
setController(controller);
}
代碼邏輯就是判斷緩存中是否存在,存在即請求Wi-Fi環(huán)境下的圖片url,不存在就請求流量環(huán)境下的圖片url.至于判斷兩次緩存是源于fresco的三級緩存原理妹孙,一個是內(nèi)存中的緩存一個是磁盤緩存。同樣這里去請求Wi-Fi環(huán)境下的圖片URL因為事先有緩存的获枝,也只是直接使用緩存并不會進(jìn)行實際網(wǎng)絡(luò)下載的蠢正。經(jīng)測試也滿足了領(lǐng)導(dǎo)的要求,在性能上肉眼也未發(fā)現(xiàn)明顯的差異省店。
總結(jié)
盡管嘗試2的方法實現(xiàn)了領(lǐng)導(dǎo)的需求嚣崭,但是有個小風(fēng)險的查詢緩存的代碼是在主線程中執(zhí)行的,當(dāng)上列表的時候有造成頁面卡頓的可能懦傍,但我拿項目測試的時候并未發(fā)現(xiàn)這樣雹舀,也就沒在意。搜了下還有個方式查詢粗俱,不過代碼方式麻煩了些说榆。還有方式一不行也許是我姿勢不對原因,有興趣的多多交流寸认。