資源描述:
《圖片緩存之內(nèi)存緩存技術(shù)LruCache》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、圖片緩存之內(nèi)存緩存技術(shù)LruCache,軟引用每當(dāng)碰到一些大圖片的時候,我們?nèi)绻粚D片進(jìn)行處理就會報OOM異常,這個問題曾經(jīng)讓我覺得很煩惱,后來終于得到了解決,那么現(xiàn)在就讓我和大家一起分享一下吧。這篇博文要講的圖片緩存機(jī)制,我接觸到的有兩鐘,一種是軟引用,另一種是內(nèi)存緩存技術(shù)。先來看下兩者的使用方式,再來作比較。除了加載圖片時要用到緩存處理,還有一個比較重要的步驟要做,就是要先壓縮圖片。1、壓縮圖片至于要壓縮到什么狀態(tài)就要看自己當(dāng)時的處境了,壓縮圖片的時候既要達(dá)到一個小的值,又不能讓其模糊,更不能拉伸圖片。1./**2.????
2、????*加載內(nèi)存卡圖片3.????????*/4.????????BitmapFactory.Optionsoptions?=?new?BitmapFactory.Options();5.????????options.inJustDecodeBounds?=?true;?//設(shè)置了此屬性一定要記得將值設(shè)置為false6.????????Bitmapbitmap?=?null;7.????????bitmap?=?BitmapFactory.decodeFile(url,?options);8.????????int?be?=?
3、(int)?((options.outHeight?>?options.outWidth???options.outHeight?/?1509.????????????????:?options.outWidth?/?200));10.????????if?(be?<=?0)?//判斷200是否超過原始圖片高度11.????????????be?=?1;?//如果超過,則不進(jìn)行縮放12.????????options.inSampleSize?=?be;13.????????options.inPreferredConfig?=?
4、Bitmap.Config.ARGB_4444;14.????????options.inPurgeable?=?true;15.????????options.inInputShareable?=?true;16.????????options.inJustDecodeBounds?=?false;17.????????try?{18.????????????bitmap?=?BitmapFactory.decodeFile(url,?options);19.????????}?catch?(OutOfMemoryError?e
5、)?{20.????????????System.gc();21.????????????Log.e(TAG,?"OutOfMemoryError");22.????????}2、軟引用:只要有足夠的內(nèi)存,就一直保持對象,直到發(fā)現(xiàn)內(nèi)存吃緊且沒有StrongRef時才回收對象。我們可以這樣定義:map里面的鍵是用來放圖片地址的,既可以是網(wǎng)絡(luò)上的圖片地址,也可以SDcard上的圖片地址,map里面的值里面放的是持有軟引用的Bitmap,當(dāng)然如果你要放Drawable,那也是可以的。1.private?Map6、eference>?imageMap?=?new?HashMap>();接下來就讓我再介紹一下如何具體加載圖片:步驟:(1)先通過URL查看緩存中是否有圖片,如果有,則直接去緩存中取得。???????????如果沒有,就開線程重新去網(wǎng)上下載。??????(2)下載完了之后,就把圖片放在緩存里面,方便下次可以直接從緩存中取得。1.public?BitmaploadBitmap(final?String?imageUrl,final?ImageCallBack
7、imageCallBack)?{2.????????SoftReference?reference?=?imageMap.get(imageUrl);3.????????if(reference?!=?null)?{4.????????????if(reference.get()?!=?null)?{5.????????????????return?reference.get();6.????????????}7.????????}8.????????final?Handler?handler?=?new?Hand
8、ler()?{9.????????????public?void?handleMessage(final?android.os.Messagemsg)?{10.????????????????//加入到緩存中11.????????????????B