歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android 利用緩存機制實現文件下載

在下載文件或者在線浏覽文件時,或者為了保證文件下載的正確性,需要使用緩存機制,常使用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)給緩存文件加密。最簡單就是去掉文件的擴展名,這也算加密,當然,你可以把服務端文件加密,然後在內存中解密。這就看項目的需求而定,我的經驗也不足,一般就是改改擴展名之類的。

Copyright © Linux教程網 All Rights Reserved