Android 文件下載引擎,穩定、高效、簡單易用:FileDownloader
Android 文件下載引擎,穩定、高效、簡單易用
特點
- 簡單易用
- 高并發
- 獨立進程
- 自動斷點續傳 </ul>
- 為了絕大多數使用性能考慮,目前下載引擎目前受限于int可表示的范圍,而我們的回調total與so far以byte為單位回調,因此最大只能表示到2^31-1=2_147_483_647 = 1.99GB(ps: 如果有更大的文件下載需求,提issue,我們會進行一些巧妙的優化,利用負值區間?根據大小走特殊通道傳輸?)
- 暫停: paused, 恢復: 直接調用start,默認就是斷點續傳
- retryOnConnectionFailure: Unreachable IP addresses/Stale pooled connections/Unreachable proxy servers
- connection/read/write time out 10s
需要注意
使用okHttp并使用其中的一些默認屬性
I. 效果
II. 使用
在項目中引用:
compile 'com.liulishuo.filedownloader:library:0.1.2'
全局初始化在Application.onCreate中 public XXApplication extends Application{
...
@Override
public void onCreate() {
// 不耗時,做一些簡單初始化準備工作,不會啟動下載進程
FileDownloader.init(this);
}
...
}
啟動單任務下載
FileDownloader.getImpl().create(url)
.setPath(path)
.setListener(new FileDownloadListener() {
@Override
protected void pending(BaseDownloadTask task, int soFarBytes, int totalBytes) {
}
@Override
protected void connected(BaseDownloadTask task, String etag, boolean isContinue, int soFarBytes, int totalBytes) {
}
@Override
protected void progress(BaseDownloadTask task, int soFarBytes, int totalBytes) {
}
@Override
protected void blockComplete(BaseDownloadTask task) {
}
@Override
protected void retry(final BaseDownloadTask task, final Throwable ex, final int retryingTimes, final int soFarBytes) {
}
@Override
protected void completed(BaseDownloadTask task) {
}
@Override
protected void paused(BaseDownloadTask task, int soFarBytes, int totalBytes) {
}
@Override
protected void error(BaseDownloadTask task, Throwable e) {
}
@Override
protected void warn(BaseDownloadTask task) {
}
}).start();
啟動多任務下載
final FileDownloadListener queueTarget = new FileDownloadListener() {
@Override
protected void pending(BaseDownloadTask task, int soFarBytes, int totalBytes) {
}
@Override
protected void connected(BaseDownloadTask task, String etag, boolean isContinue, int soFarBytes, int totalBytes) {
}
@Override
protected void progress(BaseDownloadTask task, int soFarBytes, int totalBytes) {
}
@Override
protected void blockComplete(BaseDownloadTask task) {
}
@Override
protected void retry(final BaseDownloadTask task, final Throwable ex, final int retryingTimes, final int soFarBytes) {
}
@Override
protected void completed(BaseDownloadTask task) {
}
@Override
protected void paused(BaseDownloadTask task, int soFarBytes, int totalBytes) {
}
@Override
protected void error(BaseDownloadTask task, Throwable e) {
}
@Override
protected void warn(BaseDownloadTask task) {
}
};
for (String url : URLS) {
FileDownloader.getImpl().create(url)
.setListener(queueTarget)
.ready();
}
if(serial){
// 串行執行該隊列
FileDownloader.getImpl().start(queueTarget, true);
}
if(parallel){
// 并行執行該隊列
FileDownloader.getImpl().start(queueTarget, false);
}
全局接口說明(FileDownloader.)
所有的暫停,就是停止,會釋放所有資源并且停到所有相關線程,下次啟動的時候默認會斷點續傳
所有的暫停,就是停止,會釋放所有資源并且停到所有相關線程,下次啟動的時候默認會斷點續傳
方法名 | 備注 |
---|---|
init(Application) | 簡單初始化,不會啟動下載進程 |
create(url:String) | 創建一個下載任務 |
start(listener:FileDownloadListener, isSerial:boolean) | 啟動是相同監聽器的任務,串行/并行啟動 |
pause(listener:FileDownloadListener) | 暫停啟動相同監聽器的任務 |
pauseAll(void) | 暫停所有任務 |
pause(downloadId) | 啟動downloadId的任務 |
getSoFar(downloadId) | 獲得下載Id為downloadId的soFarBytes |
getTotal(downloadId) | 獲得下載Id為downloadId的totalBytes |
bindService(void) | 主動啟動下載進程(可事先調用該方法(可以不調用),保證第一次下載的時候沒有啟動進程的速度消耗) |
unBindService(void) | 主動停止下載進程(如果不調用該方法,進程閑置一段時間以后,系統調度會自動將其回收) |
Task接口說明
方法名 | 備注 |
---|---|
setPath(path:String) | 下載文件的存儲絕對路徑 |
setListener(listener:FileDownloadListener) | 設置監聽,可以以相同監聽組成隊列 |
setCallbackProgressTimes(times:int) | 設置progress最大回調次數 |
setTag(tag:Object) | 內部不會使用,在回調的時候用戶自己使用 |
setForceReDownload(isForceReDownload:boolean) | 強制重新下載,將會忽略檢測文件是否健在 |
setFinishListener(listener:FinishListener) | 結束監聽,僅包含結束(over(void))的監聽 |
setAutoRetryTimes(autoRetryTimes:int) | 當請求或下載或寫文件過程中存在錯誤時,自動重試次數,默認為0次 |
ready(void) | 用于隊列下載的單任務的結束符(見上面:啟動多任務下載的案例) |
start(void) | 啟動下載任務 |
pause(void) | 暫停下載任務(也可以理解為停止下載,但是在start的時候默認會斷點續傳) |
getDownloadId(void):int | 獲取唯一Id(內部通過url與path生成) |
getUrl(void):String | 獲取下載連接 |
getCallbackProgressTimes(void):int | 獲得progress最大回調次數 |
getPath(void):String | 獲取下載文件存儲路徑 |
getListener(void):FileDownloadListener | 獲取監聽器 |
getSoFarBytes(void):int | 獲取已經下載的字節數 |
getTotalBytes(void):int | 獲取下載文件總大小 |
getStatus(void):int | 獲取當前的狀態 |
isForceReDownload(void):boolean | 是否強制重新下載 |
getEx(void):Throwable | 獲取下載過程拋出的Throwable |
isReusedOldFile(void):boolean | 判斷是否是直接使用了舊文件(檢測是有效文件),沒有啟動下載 |
getTag(void):Object | 獲取用戶setTag進來的Object |
isContinue(void):boolean | 是否成功斷點續傳 |
getEtag(void):String | 獲取當前下載獲取到的ETag |
getAutoRetryTimes(void):int | 自動重試次數 |
getRetryingTimes(void):int | 當前重試次數。將要開始重試的時候,會將接下來是第幾次 |
監聽器(FileDownloadListener)說明
一般的下載回調流程:
pending -> connected -> (progress <->progress) -> [retry] -> blockComplete -> completed
可能會遇到以下回調而直接終止整個下載過程:
paused / completed / error / warn
如果檢測存在已經下載完成的文件(可以通過isReusedOldFile進行決策是否是該情況)(也可以通過setForceReDownload(true)來避免該情況):
blockComplete -> completed
方法說明
回調方法 | 備注 | 帶回數據 |
---|---|---|
pending | 等待,已經進入下載隊列 | 數據庫中的soFarBytes與totalBytes |
connected | 已經連接上 | ETag, 是否斷點續傳, soFarBytes, totalBytes |
progress | 下載進度回調 | soFarBytes |
blockComplete | 在完成前同步調用該方法,此時已經下載完成 | - |
retry | 重試之前把將要重試是第幾次回調回來 | 之所以重試遇到Throwable, 將要重試是第幾次, soFarBytes |
completed | 完成整個下載過程 | - |
paused | 暫停下載 | soFarBytes |
error | 下載出現錯誤 | 拋出的Throwable |
warn | 在下載隊列中(正在等待/正在下載)已經存在相同下載連接與相同存儲路徑的任務 | - |
本文由用戶 碼頭工人 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!