1. 程式人生 > >Android 檔案下載引擎,穩定、高效、簡單易用:FileDownloader(結合okhttp)

Android 檔案下載引擎,穩定、高效、簡單易用:FileDownloader(結合okhttp)

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 在下載佇列中(正在等待/正在下載)已經存在相同下載連線與相同儲存路徑的任務 -