日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android缓存之Lrucache 和LinkedHashMap

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

兩者的區別

網上有很多人使用軟引用加載圖片的多?,但是現在已經不再推薦使用這種方式了,
(1)因為從 Android 2.3 (API Level 9)開始,垃圾回收器會更傾向于回收持有軟引用或弱引用的對象,
???? 這讓軟引用和弱引用變得不再可靠。
(2)另外,Android 3.0 (API Level 11)中,圖片的數據會存儲在本地的內存當中,
???? 因而無法用一種可預見的方式將其釋放,這就有潛在的風險造成應用程序的內存溢出并崩潰,
所以我這里用得是LruCache來緩存圖片,當存儲Image的大小大于LruCache設定的值,系統自動釋放內存,
這個類是3.1版本中提供的,如果你是在更早的Android版本中開發,則需要導入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的全部內容,希望文章能夠幫你解決所遇到的問題。

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