標籤:android 記憶體 最佳化 緩衝
前言:
在上一篇文章中介紹了記憶體緩衝,記憶體緩衝的優點就是很快,但是它又有缺點:
- 空間小,記憶體緩衝不可能很大;
- 記憶體緊張時可能被清除;
- 在應用退出時就會消失,做不到離線;
基於以上的缺點有時候又需要另外一種緩衝,那就是磁碟緩衝。大家應該都用過新聞用戶端,很多都有離線功能,功能的實現就是磁碟緩衝。
DiskLruCache:
在Android中用到的磁碟緩衝大多都是基於DiskLruCache實現的,具體怎麼使用呢?
public static DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize);
open()方法接收四個參數,第一個參數是資料的快取檔案地址,第二個參數是當前應用程式的版本號碼,第三個參數是同一個key可以對應多少個快取檔案,一般都是傳1,第四個參數是最多可以緩衝多少位元組的資料,10M?
// Creates a unique subdirectory of the designated app cache directory. Tries to use external// but if not mounted, falls back on internal storage.//建立磁碟快取檔案,首選sdcard,如果sdcard沒有掛載或者沒有sdcard則擷取應用預設的cache目錄public static File getDiskCacheDir(Context context, String uniqueName) { // Check if media is mounted or storage is built-in, if so, try and use external cache dir // otherwise use internal cache dir final String cachePath = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !isExternalStorageRemovable() ? getExternalCacheDir(context).getPath() : context.getCacheDir().getPath(); return new File(cachePath + File.separator + uniqueName);}
public int getAppVersion(Context context) {try {PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);return packageInfo.versionCode;} catch (NameNotFoundException e) {e.printStackTrace();}return 1;}
DiskLruCache mDiskLruCache = null;try {File cacheDir = getDiskCacheDir(context, "thumbnails");if (!cacheDir.exists()) {cacheDir.mkdirs();}mDiskLruCache = DiskLruCache.open(cacheDir, getAppVersion(context), 1, 10 * 1024 * 1024);} catch (IOException e) {e.printStackTrace();}
//添加緩衝public void addBitmapToCache(String key, Bitmap bitmap) { // Add to memory cache as before,把緩衝放到記憶體緩衝中 if (getBitmapFromMemCache(key) == null) { mMemoryCache.put(key, bitmap); } // Also add to disk cache,把緩衝放入磁碟緩衝 synchronized (mDiskCacheLock) { if (mDiskLruCache != null && mDiskLruCache.get(key) == null) { mDiskLruCache.put(key, bitmap); } }}//擷取緩衝public Bitmap getBitmapFromDiskCache(String key) { synchronized (mDiskCacheLock) { // Wait while disk cache is started from background thread while (mDiskCacheStarting) { try { mDiskCacheLock.wait(); } catch (InterruptedException e) {} } if (mDiskLruCache != null) { return mDiskLruCache.get(key); } } return null;}總結:
以上是磁碟緩衝的建立和使用方法。在實際操作中記憶體緩衝和磁碟緩衝是配合起來使用的,一般先從記憶體緩衝中讀取資料,如果沒有再從磁碟緩衝中讀取。個人水平有限,有什麼問題可以留言,最好是添加我的公眾號:coder_online,我能及時的看到你的留言並給你回覆。
想第一時間獲得更多原創文章,請關注個人公眾平台:程式員互動聯盟(coder_online),掃一掃下方二維碼或者搜尋號coder_online即可關注,裡面有大量Android,Chromium,Linux,編程技巧等相關文章等著您,我們還可以線上交流。
Android記憶體最佳化之記憶體緩衝