Android 檔案下載引擎,穩定、高效、簡單易用:FileDownloader(結合okhttp)
阿新 • • 發佈:2019-01-01
Android 檔案下載引擎,穩定、高效、簡單易用
特點
簡單易用
高併發
獨立程序
自動斷點續傳
需要注意
為了絕大多數使用效能考慮,目前下載引擎目前受限於int可表示的範圍,而我們的回撥total與so far以byte為單位回撥,因此最大隻能表示到2^31-1=2_147_483_647 = 1.99GB(ps: 如果有更大的檔案下載需求,提issue,我們會進行一些巧妙的優化,利用負值區間?根據大小走特殊通道傳輸?)
暫停: paused, 恢復: 直接呼叫start,預設就是斷點續傳
使用okHttp並使用其中的一些預設屬性
retryOnConnectionFailure: Unreachable IP addresses/Stale pooled connections/Unreachable proxy servers
connection/read/write time out 10s
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 在下載佇列中(正在等待/正在下載)已經存在相同下載連線與相同儲存路徑的任務 -
特點
簡單易用
高併發
獨立程序
自動斷點續傳
需要注意
為了絕大多數使用效能考慮,目前下載引擎目前受限於int可表示的範圍,而我們的回撥total與so far以byte為單位回撥,因此最大隻能表示到2^31-1=2_147_483_647 = 1.99GB(ps: 如果有更大的檔案下載需求,提issue,我們會進行一些巧妙的優化,利用負值區間?根據大小走特殊通道傳輸?)
暫停: paused, 恢復: 直接呼叫start,預設就是斷點續傳
使用okHttp並使用其中的一些預設屬性
retryOnConnectionFailure: Unreachable IP addresses/Stale pooled connections/Unreachable proxy servers
connection/read/write time out 10s
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 在下載佇列中(正在等待/正在下載)已經存在相同下載連線與相同儲存路徑的任務 -