Android-DiskLruCache

DiskLruCache用于實(shí)現(xiàn)磁盤緩存烙如,它通過將緩存文件寫入文件系統(tǒng)實(shí)現(xiàn)緩存的效果爹袁。
使用前先添加依賴

implementation 'com.jakewharton:disklrucache:2.0.2'
public static File getDiskCacheDir() {
        String State=Environment.MEDIA_MOUNTED;
        if(State.equals(Environment.getExternalStorageState())||!isExternalStorageRemovable()){
            return new File(mContext.getExternalCacheDir().getPath()+File.separator+"BitmapCache");
        }else{
            return new File(mContext.getCacheDir().getPath()+File.separator+"BitmapCache");
        }
    }

該方法用于獲取緩存目錄
Environment.MEDIA_MOUNTED表示存儲(chǔ)媒體已掛載,并可以讀寫
Environment.getExternalStorageState()獲取外部存儲(chǔ)的狀態(tài)
isExternalStorageRemovable()表示外部存儲(chǔ)已經(jīng)被移除
如果外部可以儲(chǔ)存就存入/storage/emulated/0/Android/data/package_name/cache這個(gè)目錄
否則 存入/data/data/package_name/cache赘那。

首先是初始化

File cacheDir=getDiskCacheDir();
        if(!cacheDir.exists()){
            cacheDir.mkdirs();
        }
        try {
            mDiskLruCache=DiskLruCache.open(cacheDir,1,1,1024*1024*50);
        } catch (IOException e) {
            e.printStackTrace();
        }

DiskLruCache.open()有四個(gè)參數(shù)刑桑,2.版本號(hào),3.單個(gè)節(jié)點(diǎn)對(duì)應(yīng)的數(shù)據(jù)個(gè)數(shù)募舟,4表示數(shù)據(jù)大小祠斧,如1024X1024X50表示50MB。

private String byteToHexString(byte[] bytes){
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<bytes.length;i++){
            String hex=Integer.toHexString(0xFF&bytes[i]);
            if(hex.length()==1){
                sb.append('0');
            }
            sb.append(hex);
        }
        return sb.toString();
    }

該方法用于講byte轉(zhuǎn)換為16進(jìn)制拱礁,因?yàn)閖ava采用二進(jìn)制補(bǔ)碼琢锋,當(dāng)系統(tǒng)檢測(cè)到byte可能轉(zhuǎn)換成int(32位)或與int運(yùn)算,可能會(huì)對(duì)byte補(bǔ)1擴(kuò)充至32位呢灶,與0xff運(yùn)算使結(jié)構(gòu)不變吴超。

DiskLruche的緩存操作是通過Editor完成的,Editor便是緩存對(duì)象的編輯對(duì)象鸯乃。
通常來說可以用url的md5作為圖片的key鲸阻,url可能會(huì)有特殊字符,不易直接使用缨睡。

private String hashKeyFormUrl(String url){
        String cacheKey=null;
        try {
            final MessageDigest mDigest=MessageDigest.getInstance("MD5");
            mDigest.update(url.getBytes());
            cacheKey=byteToHexString(mDigest.digest());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return cacheKey;
    }

MessageDigest用于提供信息摘要算法功能鸟悴,有MD5和SHA,MD5用于確保信息傳輸完整一致宏蛉。

String uriStr=editText.getText().toString();
                        String key=hashKeyFormUrl(uriStr);
                        try {
                            DiskLruCache.Editor editor=mDiskLruCache.edit(key);
                            if(editor!=null){
                                OutputStream out=editor.newOutputStream(0);
                                if(downloadUrlToString(uriStr,out)){
                                    editor.commit();
                                }else{
                                    editor.abort();
                                }
                                mDiskLruCache.flush();
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

editor.newOutputStream(DISK_CACHE_INDEX);用于獲取文件輸出流

下載操作

public boolean downloadUrlToString(String url, OutputStream out){
        HttpURLConnection connection=null;
        BufferedInputStream bin=null;
        BufferedOutputStream bout=null;

        try {
            final URL fUrl=new URL(url);
            connection=(HttpURLConnection)fUrl.openConnection();
            bin=new BufferedInputStream(connection.getInputStream());
            bout=new BufferedOutputStream(out);
            int b;
            while((b=bin.read())!=-1){
                bout.write(b);
            }
            return true;
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(connection!=null){
                connection.disconnect();
            }
            try {
                if(bin!=null)
                bin.close();
                if(bout!=null)
                bout.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }return false;
    }
editor.commit()//最后需要通過commit()來提供寫入操作
editor.abort()//如果發(fā)生異常遣臼,用來退回整個(gè)操作。

最后是緩存的讀取方法

private Bitmap getBitmapFromCache(String urlStr){
        String key=hashKeyFormUrl(urlStr);
        try {
            DiskLruCache.Snapshot snapshot=mDiskLruCache.get(key);
            if(snapshot!=null){
                InputStream in=snapshot.getInputStream(0);
                return BitmapFactory.decodeStream(in);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拾并,一起剝皮案震驚了整個(gè)濱河市揍堰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嗅义,老刑警劉巖屏歹,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異之碗,居然都是意外死亡蝙眶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幽纷,“玉大人式塌,你說我怎么就攤上這事∮呀” “怎么了峰尝?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)收恢。 經(jīng)常有香客問我武学,道長(zhǎng),這世上最難降的妖魔是什么伦意? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任火窒,我火速辦了婚禮,結(jié)果婚禮上驮肉,老公的妹妹穿的比我還像新娘熏矿。我一直安慰自己,他們只是感情好缆八,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布曲掰。 她就那樣靜靜地躺著疾捍,像睡著了一般奈辰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乱豆,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天奖恰,我揣著相機(jī)與錄音,去河邊找鬼宛裕。 笑死瑟啃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的揩尸。 我是一名探鬼主播蛹屿,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼岩榆!你這毒婦竟也來了错负?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤勇边,失蹤者是張志新(化名)和其女友劉穎犹撒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粒褒,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡识颊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奕坟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祥款。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡清笨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出刃跛,到底是詐尸還是另有隱情函筋,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布奠伪,位于F島的核電站跌帐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏绊率。R本人自食惡果不足惜谨敛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滤否。 院中可真熱鬧脸狸,春花似錦、人聲如沸藐俺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽欲芹。三九已至卿啡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間菱父,已是汗流浹背颈娜。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浙宜,地道東北人官辽。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像粟瞬,于是被迫代替她去往敵國和親同仆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350