Android 文件下載引擎,穩定、高效、簡單易用:FileDownloader

碼頭工人 8年前發布 | 132K 次閱讀 Android開發 移動開發 FileDownloader

Android 文件下載引擎,穩定、高效、簡單易用


特點

  • 簡單易用
  • 高并發
  • 獨立進程
  • 自動斷點續傳
  • </ul>

    需要注意

    • 為了絕大多數使用性能考慮,目前下載引擎目前受限于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 在下載隊列中(正在等待/正在下載)已經存在相同下載連接與相同存儲路徑的任務 -


    官方網站:http://www.baiduhome.net/lib/view/home/1451397722511

 本文由用戶 碼頭工人 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!