資源描述:
《listview異步加載網(wǎng)絡(luò)圖片之雙緩存技術(shù)》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、www.tsingyuan.cnListView異步加載網(wǎng)絡(luò)圖片之雙緩存技術(shù)問題描述:在這一篇博客中將會為大家講解如何將下載回來的圖片進(jìn)行緩存,為了節(jié)約流量,并且提高下一次顯示圖片的速度,提高用戶體驗(yàn),所以不能夠每次調(diào)用getView的時候都去從網(wǎng)絡(luò)下載圖片,就必須用到緩存。緩存的重點(diǎn)問題:如何控制緩存的大小,如果我們一直向緩存中篩數(shù)據(jù),而沒有對緩存的大小進(jìn)行控制,那么最終會導(dǎo)致OOM解決方案:設(shè)置兩級緩存,第一級用LinkedHashMap保留Bitmap的強(qiáng)引用,但是控制緩存的大小MAX_CAPACITY=10,當(dāng)繼續(xù)向該緩存中存數(shù)據(jù)的時候,將會把一級緩
2、存中的最近最少使用的元素放入二級緩存ConcurrentHashMap>,二級緩存中保留的Bitmap的軟引用。SoftReference:它保存的對象實(shí)例,除非JVM即將OutOfMemory,否則不會被GC回收。這個特性使得它特別適合設(shè)計對象Cache。對于Cache,我們希望被緩存的對象最好始終常駐內(nèi)存,但是如果JVM內(nèi)存吃緊,為了不發(fā)生OutOfMemoryError導(dǎo)致系統(tǒng)崩潰,必要的時候也允許JVM回收Cache的內(nèi)存,待后續(xù)合適的時機(jī)再把數(shù)據(jù)重新Load到Cache中。這樣可以系統(tǒng)設(shè)計得更具彈性。Java代碼收藏代碼
3、//0.75是加載因子為經(jīng)驗(yàn)值,true則表示按照最近訪問量的高低排序,false則表示按照插入順序排序privateHashMapmFirstLevelCache=newLinkedHashMap(MAX_CAPACITY/2,0.75f,true){privatestaticfinallongserialVersionUID=1L;protectedbooleanremoveEldestEntry(Entryeldest){if(size()>MAX_CAPACITY){//當(dāng)超過一級緩存閾值的
4、時候,將老的值從一級緩存搬到二級緩存mSecondLevelCache.put(eldest.getKey(),newSoftReference(eldest.getValue()));returntrue;}returnfalse;};};加載圖片:先讀緩存,緩存么有就開啟異步任務(wù)從網(wǎng)絡(luò)下載Java代碼收藏代碼/***加載圖片,如果緩存中有就直接從緩存中拿,緩存中沒有就下載*@paramurl*@paramadapter*@paramholder*/publicvoidloadImage(Stringurl,BaseAdapteradapter,ViewHolderho
5、lder){resetPurgeTimer();Bitmapbitmap=getBitmapFromCache(url);//從緩存中讀取if(bitmap==null){holder.mImageView.setImageResource(R.drawable.ic_launcher);//緩存沒有設(shè)為默認(rèn)圖片www.tsingyuan.cnImageLoadTaskimageLoadTask=newImageLoadTask();imageLoadTask.execute(url,adapter,holder);//執(zhí)行異步任務(wù)}else{holder.mImageView.setI
6、mageBitmap(bitmap);//設(shè)為緩存圖片}}讀取緩存的代碼:Java代碼收藏代碼publicBitmapgetBitmapFromCache(Stringurl){Bitmapbitmap=null;bitmap=getFromFirstLevelCache(url);//從一級緩存中拿if(bitmap!=null){returnbitmap;}bitmap=getFromSecondLevelCache(url);//從二級緩存中拿returnbitmap;}privateBitmapgetFromFirstLevelCache(Stringurl){Bitmapbit
7、map=null;synchronized(mFirstLevelCache){bitmap=mFirstLevelCache.get(url);if(bitmap!=null){//將最近訪問的元素放到鏈的頭部,提高下一次訪問該元素的檢索速度(LRU算法)mFirstLevelCache.remove(url);mFirstLevelCache.put(url,bitmap);}}returnbitmap;}privateBitm