Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 由Android緩存設計想到的

由Android緩存設計想到的

編輯:關於Android編程

由Android緩存設計想到的

前言

Android這種對內存比較敏感的系統,在處理大量圖片的時候不可避免要用到緩存,那麼到底是應該使用虛擬機底層通過GC回收保障的SoftReference,還是使用一個帶LRU算法的隊列,哪個更適合Android系統下的應用?

基本概念

緩存,顧名思義把已經讀取到的數據存下來,供再次讀取,合理的使用緩存可以減少一些昂貴代價的動作(數據庫操作,文件讀寫,網絡傳輸,等),緩解系統壓力,提高程序響應速度。

設計緩存需要注意的幾個方面:緩存的容量,如何使緩存維持在一個合適的大小(過期緩存的處理,超過容量的處理),如何處理並發,等等。

實作

SoftReference LRU Queue Google官方的做法

基於SoftReference實現緩存

這裡在根據圖片url獲取圖片並轉換成Bitmap時,做兩級緩存:一級是內存緩存,這裡使用HashMap保存Bitmap的soft引用,key為url;另外一級是持久化緩存,這裡用的是文件存儲(也可以換成數據庫存儲)。
我們來看一下主要代碼:


    SoftReference currBitmap = imageCaches.get(url);
        Bitmap softRefBitmap = null;
        if (currBitmap != null) {
            softRefBitmap = currBitmap.get();
        }
......
// 先從軟引用中拿數據
        if (currBitmap != null && mImageView != null && softRefBitmap != null
                && url.equals(mImageView.getTag())) {
            mImageView.setImageBitmap(softRefBitmap);
        }
        // 軟引用中沒有,從文件中拿數據
        else if (bitmap != null && mImageView != null
                && url.equals(mImageView.getTag())) {
            mImageView.setImageBitmap(bitmap);
        }
        // 文件中也沒有,此時創建線程從網絡上獲取數據
        else if (url != null && needCreateNewTask(mImageView)) {
            MyAsyncTask task = new MyAsyncTask(url, mImageView, download);
            if (mImageView != null) {

                task.execute();
                // 將對應的url對應的任務存起來
                map.put(url, task);
            }
        }


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved