android缓存之Lrucache 和LinkedHashMap
生活随笔
收集整理的這篇文章主要介紹了
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库如何生成sql语句
- 下一篇: 【读书笔记-数据挖掘概念与技术】分类:高