日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

android缓存之Lrucache 和LinkedHashMap

發(fā)布時間:2025/3/21 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android缓存之Lrucache 和LinkedHashMap 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

兩者的區(qū)別

網上有很多人使用軟引用加載圖片的多?,但是現(xiàn)在已經不再推薦使用這種方式了,
(1)因為從 Android 2.3 (API Level 9)開始,垃圾回收器會更傾向于回收持有軟引用或弱引用的對象,
???? 這讓軟引用和弱引用變得不再可靠。
(2)另外,Android 3.0 (API Level 11)中,圖片的數(shù)據會存儲在本地的內存當中,
???? 因而無法用一種可預見的方式將其釋放,這就有潛在的風險造成應用程序的內存溢出并崩潰,
所以我這里用得是LruCache來緩存圖片,當存儲Image的大小大于LruCache設定的值,系統(tǒng)自動釋放內存,
這個類是3.1版本中提供的,如果你是在更早的Android版本中開發(fā),則需要導入android-support-v4的jar包。

先學習下LinkedHashMap

public?LinkedHashMap?(int initialCapacity, float loadFactor, boolean accessOrder);

initialCapacity ??初始容量

loadFactor ???加載因子,一般是 0.75f

accessOrder ??false 基于插入順序 ?true ?基于訪問順序(get一個元素后,這個元素被加到最后,使用了LRU ?最近最少被使用的調度算法)

?

boolean accessOrder = true; Map<String, String> m = new LinkedHashMap<String, String>(20, .80f,accessOrder); m.put("1", "test1"); m.put("2", "test2"); m.put("3", "test3"); System.out.println(m);  //{1=test1, 2=test2, 3=test3}

?

Map<String, String> m = new LinkedHashMap<String, String>(20, .80f,accessOrder); m.put("1", "test1"); m.put("2", "test2"); m.put("3", "test3"); m.get("1"); m.get("2"); System.out.println(m); //{3=test3, 1=test1, 2=test2}

?

?

boolean accessOrder = false; Map<String, String> m = new LinkedHashMap<String, String>(20, .80f,accessOrder); m.put("1", "test1"); m.put("2", "test2"); m.put("3", "test3"); System.out.println(m);   //{1=test1, 2=test2, 3=test3}

?

boolean accessOrder = false; Map<String, String> m = new LinkedHashMap<String, String>(20, .80f,accessOrder); m.put("1", "test1"); m.put("2", "test2"); m.put("3", "test3"); m.get("1"); m.get("2"); System.out.println(m); //{1=test1, 2=test2, 3=test3}

?

public class MemoryCache {private final static int MAP_CACHE_SIZE = 15;private LruCache<String, Bitmap> lruCache = null;private LinkedHashMap<String, SoftReference<Bitmap>> merCache = null;private static MemoryCache mc = null;private MemoryCache() {merCache = new LinkedHashMap<String, SoftReference<Bitmap>>(MAP_CACHE_SIZE, 0.75f, true) {private static final long serialVersionUID = 1L;@Overrideprotected boolean removeEldestEntry(Entry<String, SoftReference<Bitmap>> eldest) {if (eldest != null) {return true;}return false;}};int lruCacheSize = (int) (Runtime.getRuntime().maxMemory() / 4);lruCache = new LruCache<String, Bitmap>(lruCacheSize) {@Overrideprotected void entryRemoved(boolean evicted, String key,Bitmap oldValue, Bitmap newValue) {if (oldValue != null) {merCache.put(key, new SoftReference<Bitmap>(oldValue));}}@Overrideprotected int sizeOf(String key, Bitmap value) {return (int) (value.getRowBytes() * value.getHeight());}};}//單例模式public static MemoryCache getInstance() {if (mc == null) {mc = new MemoryCache();}return mc;}//放入一個bitmappublic synchronized void putBitmap(String url, Bitmap bitmap) {if (bitmap != null) {lruCache.put(url, bitmap);}}//獲取bitmappublic synchronized Bitmap getBitmap(String url) {if (TextUtils.isEmpty(url)) {return null;}Bitmap bitmap = lruCache.get(url);if (bitmap != null) {lruCache.remove(url);lruCache.put(url, bitmap);return bitmap;}SoftReference<Bitmap> sr = merCache.get(url);if (sr != null) {bitmap = sr.get();if (bitmap != null) {merCache.remove(url);lruCache.put(url, bitmap);return bitmap;} else {sr = null;merCache.remove(url);}}return bitmap;}//清空HashMappublic void clear() {merCache.clear();}//刪除一個bitmappublic void delete(String url) {lruCache.remove(url);merCache.remove(url);} }

?

轉載于:https://www.cnblogs.com/wikiki/p/4346764.html

總結

以上是生活随笔為你收集整理的android缓存之Lrucache 和LinkedHashMap的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。