在下載檔案或者線上瀏覽檔案時,或者為了保證檔案下載的正確性,需要使用緩衝機制,常使用SoftReference來實現。
SoftReference的特點是它的一個執行個體儲存對一個Java對象的軟引用,該軟引用的存在不妨礙垃圾收集線程對該Java對象的回收。也就是說,一旦SoftReference儲存了對一個Java對象的軟引用後,在垃圾線程對這個Java對象回收前,SoftReference類所提供的get()方法返回Java對象的強引用。另外,一旦垃圾線程回收該Java對象之後,get()方法將返回null。軟引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果軟引用所引用的對象被記憶體回收行程回收,Java虛擬機器就會把這個軟引用加入到與之關聯的引用隊列中。
一般的緩衝策略是:
一級記憶體緩衝、二級檔案快取(資料庫也算作檔案快取)、三級網路資料
一、網路下載的緩衝策略
關於網路下載檔案(圖片、音頻、視頻)的基本策略:
1.不要直接下載到目標檔案,應使用temp檔案作中轉,以確保檔案的正確性與完整性,流程如下:
a)以網路目標檔案名 A 產生唯一的本地目標檔案名 B
b)以本地目標檔案名 B 產生唯一的本地臨時檔案名稱 T
c)下載檔案到 T 中
d)下載完畢,校正檔案 T 的正確性與完整性
e)若不正確或不完整則 delete 檔案 T,並返回 false
f)校正完畢後,將檔案 T 重新命名 或 複製到 B 檔案
g)最後的清理現場,刪除臨時檔案 T,成功後,返回 true
2.儘力提供檔案正確性與完整性的校正:
a)正確性:比如 MD5/Hash Code 比對、檔案格式的比對。
b)完整性:比如 檔案大小是否一致、圖片的資料是否正確(圖片檔案頭中提供了相關資訊)
3.考慮對於下載到本地的檔案是否需要再做二次加工,可以思考以下情況:
a)比如網路源始圖片的大小為800*600,而我們需要作為縮圖的大小為160*145,所以考慮對下載後的檔案進行裁剪,再儲存,對於源始檔案則直接刪除。
二、檔案快取策略:
1.需要唯一的快取檔案的對應I/O key,一般可以使用 hashcode。
2.若是同一個檔案,以不同的時間,可以考慮,先清本機快取,再下載新的緩衝到本地。
3.同一檔案也可以加上時間戳記後,再產生唯一hashcode。
4.組建檔案緩時,也許需要作以下全面的考慮:
a)sdcard是否已經沒有空間(這個需求是存在的,但幾乎沒有人會考慮到,一旦發生,必crash)。
b)緩衝的清理策略。每日、每周定時清理?到達一個閥值後,自動清理?(若無清理策略,把垃圾資料一直當個寶一相存著,是很SB的)。
c)緩衝真正需要的資料。不要覺外存是無限的,所以就可以什麼都存,要知道,多則繁,繁則亂。曾經有一同事,每天存幾百MB的使用者資料(所有使用者的性別、 age、連絡方式等等),而PM需要的只是一個每日數戶的活躍資料報表,於是最後改為緩衝每天的使用者分析報表資料即可(才10幾KB)。
d)給快取檔案加密。最簡單就是去掉檔案的副檔名,這也算加密,當然,你可以把服務端檔案加密,然後在記憶體中解密。這就看項目的需求而定,我的經驗也不足,一般就是改改副檔名之類的。
說明:SoftReference 詳細請看 http://blog.csdn.net/kavendb/article/details/5935577