2016.12.22
在使用圖片加載庫Glide時,要讓磁盤緩存到指定的目錄用 DiskLruCacheFactory:
由此展開的 Android 緩存策略和目錄。
一、緩存:
通俗的說就是把一些經常使用但需要聯網獲取的文件,通過一種策略持久的保存在內存或者存儲設備中,當下一次需要用到這些文件的時候,不需要聯網,直接從內存或存儲設備中獲取就可以了。這種策略就是緩存策略。
二、緩存策略:
一般來說包含緩存的添加、獲取、刪除。刪除是指緩存的大小已經超過定義的緩存的大小后移除已有的一部分緩存。比如LRU算法(最近最少使用算法)會移除最近最少使用的那一部分緩存,以此來添加新的緩存。關于緩存的好處兩點:節省流量;提高用戶體驗。
三、LruCache和DiskLruCache
LruCache 和 DiskLruCache 就是基于LRU算法的緩存策略。LruCache 是用于實現內存緩存的,而DiskLruCache 實現存儲設備緩存,也就是直接緩存到本地。其中 LruCache 在Android中已經封裝成了類,直接用就可以了。而 DiskLruCache 需要下載對應的文件才能用。
LruCache是將文件類型緩存到內存中,隨著APP中Activity的銷毀,內存也會隨之回收。也就將內存中的緩存回收掉,再次打開APP的時候,內存中找不到緩存,需要重新加載。
DiskLruCache是緩存到存儲設備中,用于實現存儲設備緩存,即磁盤緩存,它通過將緩存對象寫入文件系統從而實現緩存的效果。當APP被kill的時候,緩存不會消失。
LruCache的內部實現是LinkedHashMap,也就是集合。所以添加獲取方式通過put與get就行了。而DiskLruCache是通過文件流的形式來緩存,所以添加獲取是通過輸入輸出流來實現。
普通線程加載、LruCache 加載、DiskLruCache 加載和 Bitmap 壓縮類在一起封裝成一個大的類。就是大家常提到的ImageLoader。它專門用來處理Bitmap的加載。這三種加載方式結合,也就是大家常聽說的三級緩存機制。
四、緩存目錄
應用程序在運行的過程中如果需要向手機上保存數據,一般是把數據保存在SD卡中。
1)手機自帶的存儲空間
getFileDir() -----/data/user/0/xx.xxx.xxx(當前包)/files
getCacheDir() ----- /data/user/0/xx.xxx.xx(當前包)/cache
2)外部SD卡上
a:一部分應用是直接在SD卡的根目錄下創建一個文件夾,然后把數據保存在該文件夾中。這樣當該應用被卸載后,這些數據還保留在SDCard中,留下了垃圾數據。
b:當應用被卸載后,與該應用相關的數據也應清除掉:
Context.getExternalFilesDir()---/storage/emulated/Android/data/應用包名/files,長時間保存的數據Context.getExternalCacheDir()----/storage/emulated/Android/data/應用包名/cache,臨時緩存數據
如果使用上面的方法,當應用在被用戶卸載后,SDCard/Android/data/應用包名/ 這個目錄下的所有文件都會被刪除,不會留下垃圾信息。
注意:如果要保存下載的內容,就不要放在以上目錄下。
總結:
context.getCacheDir() ? 、context.getExternalCacheDir()
相同點:
1、相同點:都可以做app緩存目錄。
2、app卸載后,兩個目錄下的數據都會被清空。
不同點:
1、目錄的路徑不同:目錄分別存在 ?app的內部存儲上、外部SD卡上的。
2、前者的路徑需要root以后,用Root Explorer 文件管理器才能看到。后者的路徑在手機里可以直接看到。
注意:由于context.getExternalCacheDir() 的目錄存在外部SD卡上的,所以在使用這個方法的時候要判斷外部SD卡的狀態是否可用