Android記憶體最佳化之記憶體緩衝

來源:互聯網
上載者:User

標籤: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記憶體最佳化之記憶體緩衝

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.