2016.12.22
在使用圖片加載庫Glide時蚯撩,要讓磁盤緩存到指定的目錄用 DiskLruCacheFactory:
由此展開的 Android 緩存策略和目錄殴玛。
一擎宝、緩存:
通俗的說就是把一些經(jīng)常使用但需要聯(lián)網(wǎng)獲取的文件郁惜,通過一種策略持久的保存在內(nèi)存或者存儲設(shè)備中水评,當下一次需要用到這些文件的時候猩系,不需要聯(lián)網(wǎng),直接從內(nèi)存或存儲設(shè)備中獲取就可以了中燥。這種策略就是緩存策略寇甸。
二、緩存策略:
一般來說包含緩存的添加、獲取拿霉、刪除吟秩。刪除是指緩存的大小已經(jīng)超過定義的緩存的大小后移除已有的一部分緩存。比如LRU算法(最近最少使用算法)會移除最近最少使用的那一部分緩存绽淘,以此來添加新的緩存涵防。關(guān)于緩存的好處兩點:節(jié)省流量;提高用戶體驗沪铭。
三壮池、LruCache和DiskLruCache
LruCache 和 DiskLruCache 就是基于LRU算法的緩存策略。LruCache 是用于實現(xiàn)內(nèi)存緩存的杀怠,而DiskLruCache 實現(xiàn)存儲設(shè)備緩存椰憋,也就是直接緩存到本地。其中 LruCache 在Android中已經(jīng)封裝成了類赔退,直接用就可以了橙依。而 DiskLruCache 需要下載對應的文件才能用。
LruCache是將文件類型緩存到內(nèi)存中离钝,隨著APP中Activity的銷毀票编,內(nèi)存也會隨之回收。也就將內(nèi)存中的緩存回收掉卵渴,再次打開APP的時候,內(nèi)存中找不到緩存鲤竹,需要重新加載浪读。
DiskLruCache是緩存到存儲設(shè)備中,用于實現(xiàn)存儲設(shè)備緩存辛藻,即磁盤緩存碘橘,它通過將緩存對象寫入文件系統(tǒng)從而實現(xiàn)緩存的效果。當APP被kill的時候吱肌,緩存不會消失痘拆。
LruCache的內(nèi)部實現(xiàn)是LinkedHashMap,也就是集合氮墨。所以添加獲取方式通過put與get就行了纺蛆。而DiskLruCache是通過文件流的形式來緩存,所以添加獲取是通過輸入輸出流來實現(xiàn)规揪。
普通線程加載桥氏、LruCache 加載、DiskLruCache 加載和 Bitmap 壓縮類在一起封裝成一個大的類猛铅。就是大家常提到的ImageLoader字支。它專門用來處理Bitmap的加載。這三種加載方式結(jié)合,也就是大家常聽說的三級緩存機制堕伪。
四揖庄、緩存目錄
應用程序在運行的過程中如果需要向手機上保存數(shù)據(jù),一般是把數(shù)據(jù)保存在SD卡中欠雌。
1)手機自帶的存儲空間
getFileDir() -----/data/user/0/xx.xxx.xxx(當前包)/files
getCacheDir() ----- /data/user/0/xx.xxx.xx(當前包)/cache
2)外部SD卡上
a:一部分應用是直接在SD卡的根目錄下創(chuàng)建一個文件夾蹄梢,然后把數(shù)據(jù)保存在該文件夾中。這樣當該應用被卸載后桨昙,這些數(shù)據(jù)還保留在SDCard中检号,留下了垃圾數(shù)據(jù)。
b:當應用被卸載后蛙酪,與該應用相關(guān)的數(shù)據(jù)也應清除掉:
Context.getExternalFilesDir()---/storage/emulated/Android/data/應用包名/files齐苛,長時間保存的數(shù)據(jù)Context.getExternalCacheDir()----/storage/emulated/Android/data/應用包名/cache,臨時緩存數(shù)據(jù)
如果使用上面的方法桂塞,當應用在被用戶卸載后凹蜂,SDCard/Android/data/應用包名/ 這個目錄下的所有文件都會被刪除,不會留下垃圾信息阁危。
注意:如果要保存下載的內(nèi)容玛痊,就不要放在以上目錄下。
總結(jié):
context.getCacheDir() ? 狂打、context.getExternalCacheDir()
相同點:
1擂煞、相同點:都可以做app緩存目錄。
2趴乡、app卸載后对省,兩個目錄下的數(shù)據(jù)都會被清空。
不同點:
1晾捏、目錄的路徑不同:目錄分別存在 ?app的內(nèi)部存儲上蒿涎、外部SD卡上的。
2惦辛、前者的路徑需要root以后劳秋,用Root Explorer 文件管理器才能看到。后者的路徑在手機里可以直接看到胖齐。
注意:由于context.getExternalCacheDir() 的目錄存在外部SD卡上的玻淑,所以在使用這個方法的時候要判斷外部SD卡的狀態(tài)是否可用