以下內容整理自互聯網,僅用于個人學習
1. 內存緩存
通過預先消耗應用的一點內存來存儲數據,便可快速的為應用中的組件提供數據,是一種典型的以空間換時間的策略。
LruCache 類(Android v4 Support Library 類庫中開始提供)非常適合來做圖片緩存任務 ,它可以使用一個LinkedHashMap的強引用來保存最近使用的對象,并且當它保存的對象占用的內存總和超出了為它設計的最大內存時會把不經常使用的對象成員踢出以供垃圾回收器回收。
給LruCache 設置一個合適的內存大小,需考慮如下因素:
- 還剩余多少內存給你的activity或應用使用
- 屏幕上需要一次性顯示多少張圖片和多少圖片在等待顯示
- 手機的大小和密度是多少(密度越高的設備需要越大的 緩存)
- 圖片的尺寸(決定了所占用的內存大小)
- 圖片的訪問頻率(頻率高的在內存中一直保存)
- 保存圖片的質量(不同像素的在不同情況下顯示)
2. 使用磁盤緩存
內存緩存能夠快速的獲取到最近顯示的圖片,但不一定就能夠獲取到。當數據集過大時很容易把內存緩存填滿(如GridView )。你的應用也有可能被其它的任務(比如來電)中斷進入到后臺,后臺應用有可能會被殺死,那么相應的內存緩存對象也會被銷毀。 當你的應用重新回到前臺顯示時,你的應用又需要一張一張的去加載圖片了。
磁盤文件緩存能夠用來處理這些情況,保存處理好的圖片,當內存緩存不可用的時候,直接讀取在硬盤中保存好的圖片,這樣可以有效的減少圖片加載的次數。讀取磁盤文件要比直接從內存緩存中讀取要慢一些,而且需要在一個UI主線程外的線程中進行,因為磁盤的讀取速度是不能夠保證的,磁盤文件緩存顯然也是一種以空間換時間的策略。
3. 使用SQLite進行緩存
網絡請求數據完成后,把文件的相關信息(如url(一般作為唯一標示),下載時間,過期時間)等存放到數據庫。下次加載的時候根據url先從數據庫中查詢,如果查詢到并且時間未過期,就根據路徑讀取本地文件,從而實現緩存的效果。
注意:緩存的數據庫是存放在/data/data//databases/目錄下,是占用內存空間的,如果緩存累計,容易浪費內存,需要及時清理緩存。
4. 文件緩存
思路和一般緩存一樣,把需要的數據存儲在文件中,下次加載時判斷文件是否存在和過期(使用File.lastModified()方法得到文件的最后修改時間,與當前時間判斷),存在并未過期就加載文件中的數據,否則請求服務器重新下載。
注意,無網絡環境下就默認讀取文件緩存中的。