標籤:
在做項目的時候,難免需要將一些資料存放區在手機中,之前用sqlite和sharepreference,但是使用起來不是很方便。最近用到了一些緩衝的類,非常方便,特此記錄下來。
ASimpleCache
項目地址:https://github.com/yangfuhai/ASimpleCache
ASimpleCache 是一個為android制定的 輕量級的 開源緩衝架構。輕量到只有一個java檔案(由十幾個類精簡而來)。可以緩衝普通的字串、JsonObject、JsonArray、Bitmap、Drawable、序列化的java對象,和 byte資料,使用起來非常方便。
//儲存資料ACache mCache = ACache.get(this);mCache.put("test_key1", "test value");mCache.put("test_key2", "test value", 10);//儲存10秒,如果超過10秒去擷取這個key,將為nullmCache.put("test_key3", "test value", 2 * ACache.TIME_DAY);//儲存兩天,如果超過兩天去擷取這個key,將為null//擷取資料ACache mCache = ACache.get(this);String value = mCache.getAsString("test_key1");
LruCache
參考: Android高效載入大圖、多圖解決方案,有效避免程式OOM(郭霖大神的部落格)
記憶體緩衝技術對那些大量佔用應用程式寶貴記憶體的圖片提供了快速存取的方法。其中最核心的類是LruCache (此類在android-support-v4的包中提供) 。這個類非常適合用來緩衝圖片,它的主要演算法原理是把最近使用的對象用強引用儲存在 LinkedHashMap 中,並且把最近最少使用的對象在緩衝值達到預設定值之前從記憶體中移除。
private LruCache<String, Bitmap> mMemoryCache; @Override protected void onCreate(Bundle savedInstanceState) { // 擷取到可用記憶體的最大值,使用記憶體超出這個值會引起OutOfMemory異常。 // LruCache通過建構函式傳入緩衝值,以KB為單位。 int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); // 使用最大可用記憶體值的1/8作為緩衝的大小。 int cacheSize = maxMemory / 8; mMemoryCache = new LruCache<String, Bitmap>(cacheSize) { @Override protected int sizeOf(String key, Bitmap bitmap) { // 重寫此方法來衡量每張圖片的大小,預設返回圖片數量。 return bitmap.getByteCount() / 1024; } }; } public void addBitmapToMemoryCache(String key, Bitmap bitmap) { if (getBitmapFromMemCache(key) == null) { mMemoryCache.put(key, bitmap); } } public Bitmap getBitmapFromMemCache(String key) { return mMemoryCache.get(key); }
DiskLruCache
參考:Android DiskLruCache完全解析,硬碟緩衝的最佳方案
(參考的也是郭霖大神的部落格,裡面詳細的介紹了DiskLruCache的用法。)
LruCache只是管理了記憶體中圖片的儲存與釋放,如果圖片從記憶體中被移除的話,那麼又需要從網路上重新載入一次圖片,這顯然非常耗時。對此,Google又提供了一套硬碟緩衝的解決方案:DiskLruCache(非Google官方編寫,但獲得官方認證)。
LruCache和DiskLruCache結合
Android照片牆完整版,完美結合LruCache和DiskLruCache(還是郭霖大神的部落格)
從網路上下載圖片,並緩衝在本地。具體流程與原始碼,參考這篇部落格。
Android 關於緩衝的一些類