DiskCache

使用基本步驟:
1.將DiskCache.java放入你的工程中
2.設(shè)置DiskCache的基本思路:
(1)提供一個(gè)函數(shù)用于初始化文件緩存:該函數(shù)應(yīng)該要能夠完成兩件事:首先應(yīng)該能夠獲取DiskCache目錄,其次要能利用該目錄生成DiskCache緩存。
(2)獲取DiskCache目錄時(shí),首先需要判斷手機(jī)中是否有SD卡;
(3)實(shí)現(xiàn)在DiskCache中獲取資源的方法。該方法需要能夠根據(jù)URL得到資源在DiskCache中的存放文件的文件名。
(4)這個(gè)文件名應(yīng)該是由信息摘要算法MD5產(chǎn)生(得到一個(gè)byte數(shù)組),然后將該數(shù)組轉(zhuǎn)換成16進(jìn)制的格式(可以借助Integer類的toHexString()方法)
(5)實(shí)現(xiàn)在DiskCache中存入資源的方法。

初始化文件緩存

/**
 * 初始化文件緩存
 */
private void initDiskLruCache() {
    try {
        File cacheDir = getDiskCacheDir(context, "bitmap");
        if (!cacheDir.exists()) {
            cacheDir.mkdirs();
        }
        diskCache = DiskLruCache.open(cacheDir, getAppVersion(context), 1, DISK_CACHE_DEFAULT_SIZE);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

判斷是否有SD卡可供使用。

private File getDiskCacheDir(Context context, String uniqueName) {
    String cachePath;
    //檢測(cè)SD卡是否掛載。如果SD卡處于掛載狀態(tài)或SD卡是不可移除的
    if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
            || !Environment.isExternalStorageRemovable()) {
        cachePath = context.getExternalCacheDir().getPath();
    } else {
        cachePath = context.getCacheDir().getPath();
    }
    return new File(cachePath + File.separator + uniqueName);
}

從文件緩存中拿取數(shù)據(jù)

/**
 * 從文件緩存中拿
 * 
 * @param url
 */
public Bitmap getBitmapFromDisk(String url) {
    try {
         //取得在內(nèi)存中存放的hash串的格式
        String key = hashKeyForDisk(url);
        DiskLruCache.Snapshot snapShot = diskCache.get(key);
        if (snapShot != null) {
            InputStream is = snapShot.getInputStream(0);
            Bitmap bitmap = BitmapFactory.decodeStream(is);
            return bitmap;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    return null;
}


//為存儲(chǔ)的文件生成一個(gè)散列值作為存儲(chǔ)名。
//MD5 Message Degiest消息摘要算法版本5
//MessageDigest類:用一個(gè)單向散列函數(shù)將一個(gè)任意長度的字節(jié)序列轉(zhuǎn)換成一個(gè)固定長度的字節(jié)序列,原始
//的字節(jié)序列為信息,生成的固定長度的字節(jié)序列為摘要
private String hashKeyForDisk(String key) {
    String cacheKey;
    try {
        //返回一個(gè)使用特定算法的MessageDigest類的實(shí)例。
        final MessageDigest mDigest = MessageDigest.getInstance("MD5");
        mDigest.update(key.getBytes());//使用指定的字節(jié)數(shù)組更新摘要
       //digest函數(shù)通過執(zhí)行諸如填充之類的最終操作完成哈希計(jì)算。
       //計(jì)算完成后,摘要接收器被重置。(返回值為字節(jié)數(shù)組)
        cacheKey = bytesToHexString(mDigest.digest());//轉(zhuǎn)換成十六進(jìn)制串
    } catch (NoSuchAlgorithmException e) {
        cacheKey = String.valueOf(key.hashCode());
    }
    return cacheKey;
}

將字節(jié)數(shù)組轉(zhuǎn)換成十六進(jìn)制串

private String bytesToHexString(byte[] bytes) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < bytes.length; i++) {
        //返回字節(jié)的十六進(jìn)制形式
        String hex = Integer.toHexString(0xFF & bytes[i]);
        if (hex.length() == 1) {
            sb.append('0');
        }
        sb.append(hex);
    }
    return sb.toString();
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 《ilua》速成開發(fā)手冊(cè)3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 1...
    葉染柒丶閱讀 11,586評(píng)論 0 11
  • 第1篇Objective-C準(zhǔn)備篇 第1章Objective-C學(xué)習(xí)環(huán)境準(zhǔn)備 1.1Objective-C基礎(chǔ) 1...
    奮拓達(dá)閱讀 779評(píng)論 0 2
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,658評(píng)論 30 472
  • 本來以為我能在醫(yī)院一直住到數(shù)據(jù)調(diào)完,等著之后拍完片子確認(rèn)腿已經(jīng)全部糾正之后才出院的,結(jié)果,在我的數(shù)據(jù)還沒調(diào)完的時(shí)候...
    王秀燕閱讀 391評(píng)論 0 0
  • 碎嘴女人姓李,二十一歲,第一次見識(shí)她的功力,是在圖書館的自習(xí)室里,我離她兩排桌椅,依舊可以聽到她單方面和同學(xué)批判...
    肉肉的大林閱讀 508評(píng)論 2 1

友情鏈接更多精彩內(nèi)容