緩存策略在Android有着廣泛的使用場景.
目前比較常用的緩存算法是LRU(Least Recently Used):近期最少使用算法.
核心思想 : 當緩存滿時,會優先淘汰近期最少使用的緩存對象.
採用LRU算法的緩存有兩種:(LruCache和DiskLruCache)
一 . LruCache : 用於實現內存緩存.
LruCache是一個泛型類,並且LruCache是線程安全的:他的內部採用一個LinkedHashMap以強引用的方式存儲外界的緩存對象,其提供了put函數和get函數來完成緩存的存儲和獲取.當緩存滿時,LruCache會採用LRU算法來移除近期最少使用的緩存對象然後再添加新的緩存對象.
------------------------------------------------------------------------------------------------------------------
強引用,軟引用和弱引用的區別如下所示:
強引用 : (String str = “abc”; list.add(str); )
如果一個對象具有強引用,那就類似於必不可少的生活用品。
垃圾回收器絕不會回收它.當內存空 間不足,Java虛擬機寧願拋出OutOfMemoryError錯誤,使程序異常終止,也不會靠隨意回收具有強引用的對象來解決內存不足問題. 並且list集合中的內容即使在內存不足的情況下也不會釋放.
軟引用 :
如果一個對象只具有軟引用,那就類似於可有可物的生活用品。
如果內存空間足夠,垃圾回收器就不會回收它,如果內存空間不足了,就會回收這些對象的內存。只要垃圾回收器沒有回收它,該對象就可以被程序使用。軟引用可用來實現內存敏感的高速緩存。
軟引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果軟引用所引用的對象被垃圾回收,JAVA虛擬機就會把這個軟引用加入到與之關聯的引用隊列中。
弱引用:
如果一個對象只具有弱引用,那就類似於可有可物的生活用品。
弱引用與軟引用的區別在於:只具有弱引用的對象擁有更短暫的生命週期。在垃圾回收器線程掃描它 所管轄的內存區域的過程中,一旦發現了只具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存。不過,由於垃圾回收器是一個優先級很低的線程, 因此不一定會很快發現那些只具有弱引用的對象。
弱引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果弱引用所引用的對象被垃圾回收,Java虛擬機就會把這個弱引用加入到與之關聯的引用隊列中。
如果弱引用對象回收完之後,內存還是報警,繼續回收軟引用對象
如果虛引用對象回收完之後,內存還是報警,繼續回收弱引用對象
請遵循如下規則:
提供總容量的大小.
實例化LruCache時需要重寫sizeOf方法即可.也可以貼貼源碼.
Runtime.getRuntime().maxMemory():
//應用程序最大可用內存
int maxMemory = ((int) Runtime.getRuntime().maxMemory())/1024/1024;
//應用程序已獲得內存
long totalMemory = ((int) Runtime.getRuntime().totalMemory())/1024/1024;
//應用程序已獲得內存中未使用內存
long freeMemory = ((int) Runtime.getRuntime().freeMemory())/1024/1024;
System.out.println("---> maxMemory="+maxMemory+"M,totalMemory="+totalMemory+"M,freeMemory="+freeMemory+"M");
二 . DiskLruCache : 用於實現存儲設備緩存.
DiskLruCache用於實現存儲設備緩存,即磁盤緩存(通過將緩存對象寫入文件系統,從而實現緩存的效果).
DiskLruCache不能通過構造方法來創建,他可以通過open(File directory, int appVersion, int valueCount , long maxSize)來創建.
參數一 : File directory(磁盤緩存在文件系統中的存儲路徑)
大寫的PS : 緩存路徑可以選擇SD卡上的緩存目錄. /sdcard/Android/data/package_name/cache目錄.其中package_name表示當前的包名.好處就是當應用被卸載時此目錄會一併刪除.當然也可以選擇SD卡上的其他目錄.這樣在應用被刪除時此目錄下的緩存文件不會被刪除.具體遵循您的需求而定.
參數二 :
int appVersion(應用的版本號,一般設置爲1即可)
大寫的PS : 理論上講當版本號發生改變時DiskLruCache會清空之前所有的緩存文件,但在實際開發中則不然,沒有卵用.
參數三 : int valueCount(單個節點所對應的數據的個數,一般設置爲1即可)
參數四 : long maxSize(緩存的總大小)
大寫的PS : 例如設置緩存的總大小爲66MB,當緩存數據文件大小超出這個值時,DiskLruCache會根據最近最少使用算法清除一些緩存從而保證總大小不大於這個您設定好的緩存值.