app 下載更新 file-downloader 文件下載庫的簡單介紹和使用 ...
app 下載更新 file-downloader 文件下載庫的簡單介紹和使用
今天介紹一個下載庫:file-downloader 文件下載庫
說明:
* 本文內容來自原 file-downloader 文件下載庫 的GitHub項目地址;
* 我在這裡做了更詳細的整理;
* 下麵會羅列原項目以及原作者的信息。
項目地址:
* GitHub:https://github.com/wlfcolin/file-downloader
介紹:
* FileDownloader是安卓上輕量級Http/Https文件下載框架,我的目標是讓安卓文件下載越簡單越好,儘可能以最簡潔明瞭的方式完成複雜需求。
特點:
* 多任務並行下載
* 自動斷點續傳
* 失敗自動重試機制
* 支持大文件(超過2G)下載
* 強大方便的異常處理和異常恢復機制
* 輕鬆管理下載文件的生命周期(下載文件的增刪改查)等
適合的使用場景:
1. 需要多頁面多方位同步下載進度和下載狀態
* 比如商店APP,A頁面開啟點擊下載,B頁面和C頁面也可以看到下載進度和暫停這下載,而D頁面 可以刪除這個下載;
* 無論哪個頁面有操作,其它頁面都會收到響應的回調進行更新;
* 並且還可能還需要常駐一個service來把下載情況同步發送到通知欄的;
2. 需要斷點續傳節約流量(比如做批量應用更新APP、單個應用自己更新下載新版本、做影視需要批量緩存視頻的APP,做MP3歌曲下載APP);
3. 專門做下載的(比如迅雷之類的APP,需要下載任何伺服器上的東西,並且兼顧下載效率和開發效率的)
效果展示(圖片來自原項目GitHub):
* git圖1:https://raw.githubusercontent.com/wlfcolin/file-downloader/master/capture/simple_download_zh.gif
* git圖2:https://raw.githubusercontent.com/wlfcolin/file-downloader/master/capture/manager_download_zh.gif
版本更新日誌
* https://github.com/wlfcolin/file-downloader/blob/master/CHANGELOG.md
關於作者:
* 博客園:http://www.cnblogs.com/wlfcolin
使用:
1. 添加依賴
2. 初始化
3. 設置監聽器
4. 文件管理
1. 添加依賴:
* 在mode的build.gradle中添加依賴: compile 'org.wlf:FileDownloader:0.3.2'
2. 初始化:
* 在application的onCreate()中初始化FileDownloader;
* 初始化代碼:
* 封裝到一個方法中,在onCreate方法中調用該方法即可;
initDownload();
//初始化下載庫:如果需要更改apk的保存文件夾,修改configFileDownloadDir方法中的參數即可; private void initDownload(){ // 1.創建Builder Builder builder = new FileDownloadConfiguration.Builder(this); // 2.配置Builder // 配置下載文件保存的文件夾: FileDownloader builder.configFileDownloadDir(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "FileDownloader"); // 配置同時下載任務數量,如果不配置預設為2 builder.configDownloadTaskSize(3); // 配置失敗時嘗試重試的次數,如果不配置預設為0不嘗試 builder.configRetryDownloadTimes(5); // 開啟調試模式,方便查看日誌等調試相關,如果不配置預設不開啟 builder.configDebugMode(true); // 配置連接網路超時時間,如果不配置預設為15秒 builder.configConnectTimeout(25000);// 25秒 // 3.使用配置文件初始化FileDownloader FileDownloadConfiguration configuration = builder.build(); FileDownloader.init(configuration); }
3. 監聽器:
說明:
* 如果不需要監聽,可以忽略;
* 監聽器是基於觀察者模式設計的全局監聽器,可以設置多個;
* 記得在不需要的時候取消註冊;
* 步驟:
1. 註冊:
* 在activity或者fragment的onCreate方法中註冊;
* 如果使用service,請查說明:https://github.com/wlfcolin/file-downloader/blob/master/USEINSERVICE-zh.md
2. 註銷:
* 在activity或者fragment銷毀的時候註銷即可;
* 分類:監聽器有兩個:
* 第一個是用來監聽下載狀態的監聽器
* 第二個是用來監聽數據變化的監聽器
* 文件數據變化監聽器,監聽比如文件不存在了,被刪除了,狀態變化了等任何與文件數據變化相關都會收到通知;
* 下載狀態監聽器和文件數據變化監聽器的主要區別在於,前者關心下載進度和錯誤(前端UI),後者關心文件數據變化(數據存儲);
3.1 第一個監聽器的代碼:下載狀態的監聽器
// 1. 創建 - 監聽器 private OnFileDownloadStatusListener mOnFileDownloadStatusListener = new OnSimpleFileDownloadStatusListener() { @Override public void onFileDownloadStatusRetrying(DownloadFileInfo downloadFileInfo, int retryTimes) { // 正在重試下載(如果你配置了重試次數,當一旦下載失敗時會嘗試重試下載),retryTimes是當前第幾次重試 } @Override public void onFileDownloadStatusWaiting(DownloadFileInfo downloadFileInfo) { // 等待下載(等待其它任務執行完成,或者FileDownloader在忙別的操作) } @Override public void onFileDownloadStatusPreparing(DownloadFileInfo downloadFileInfo) { // 準備中(即,正在連接資源) @Override public void onFileDownloadStatusPrepared(DownloadFileInfo downloadFileInfo) { // 已準備好(即,已經連接到了資源) } @Override public void onFileDownloadStatusDownloading(DownloadFileInfo downloadFileInfo, float downloadSpeed, long remainingTime) { // 正在下載,downloadSpeed為當前下載速度,單位KB/s,remainingTime為預估的剩餘時間,單位秒 } @Override public void onFileDownloadStatusPaused(DownloadFileInfo downloadFileInfo) { // 下載已被暫停 } @Override public void onFileDownloadStatusCompleted(DownloadFileInfo downloadFileInfo) { // 下載完成(整個文件已經全部下載完成) } @Override public void onFileDownloadStatusFailed(String url, DownloadFileInfo downloadFileInfo, FileDownloadStatusFailReason failReason) { // 下載失敗了,詳細查看失敗原因failReason,有些失敗原因你可能必須關心 String failType = failReason.getType(); String failUrl = failReason.getUrl();// 或:failUrl = url,url和failReason.getUrl()會是一樣的 if(FileDownloadStatusFailReason.TYPE_URL_ILLEGAL.equals(failType)){ // 下載failUrl時出現url錯誤 }else if(FileDownloadStatusFailReason.TYPE_STORAGE_SPACE_IS_FULL.equals(failType)){ // 下載failUrl時出現本地存儲空間不足 }else if(FileDownloadStatusFailReason.TYPE_NETWORK_DENIED.equals(failType)){ // 下載failUrl時出現無法訪問網路 }else if(FileDownloadStatusFailReason.TYPE_NETWORK_TIMEOUT.equals(failType)){ // 下載failUrl時出現連接超時 }else{ // 更多錯誤.... } // 查看詳細異常信息 Throwable failCause = failReason.getCause();// 或:failReason.getOriginalCause() // 查看異常描述信息 String failMsg = failReason.getMessage();// 或:failReason.getOriginalCause().getMessage() } };
// 2. 註冊 - 監聽器(在onCreate方法中註冊) FileDownloader.registerDownloadStatusListener(mOnFileDownloadStatusListener);
// 3. 註銷 - 監聽器(在onDestroy方法中註銷) FileDownloader.unregisterDownloadStatusListener(mOnFileDownloadStatusListener);
註意:將相應的代碼放在項目中對應的正確的位置
3.2 第二個監聽器的代碼:數據變化監聽器
// 1. 創建 - 監聽器 private OnDownloadFileChangeListener mOnDownloadFileChangeListener = new OnDownloadFileChangeListener() { @Override public void onDownloadFileCreated(DownloadFileInfo downloadFileInfo) { // 一個新下載文件被創建,也許你需要同步你自己的數據存儲,比如在你的業務資料庫中增加一條記錄 } @Override public void onDownloadFileUpdated(DownloadFileInfo downloadFileInfo, Type type) { // 一個下載文件被更新,也許你需要同步你自己的數據存儲,比如在你的業務資料庫中更新一條記錄 } @Override public void onDownloadFileDeleted(DownloadFileInfo downloadFileInfo) { // 一個下載文件被刪除,也許你需要同步你自己的數據存儲,比如在你的業務資料庫中刪除一條記錄 } };
// 2. 註冊 - 監聽器 FileDownloader.registerDownloadFileChangeListener(mOnDownloadFileChangeListener);
// 3. 註銷 - 監聽器 FileDownloader.unregisterDownloadFileChangeListener(mOnDownloadFileChangeListener);
註意:將相應的代碼放在項目中對應的正確的位置
4. api的簡單使用: 下載文件和管理文件
// 創建一個新下載: 如果文件沒下載過,創建並開啟下載,否則繼續下載,自動會斷點續傳(如果伺服器無法支持斷點續傳將從頭開始下載) FileDownloader.start(url); // 創建一個自定義保存路徑和文件名稱的下載 FileDownloader.detect(url, new OnDetectBigUrlFileListener() { @Override public void onDetectNewDownloadFile(String url, String fileName, String saveDir, long fileSize) { // 如果有必要,可以改變文件名稱fileName和下載保存的目錄saveDir FileDownloader.createAndStart(url, newFileDir, newFileName); } @Override public void onDetectUrlFileExist(String url) { // 繼續下載,自動會斷點續傳(如果伺服器無法支持斷點續傳將從頭開始下載) FileDownloader.start(url); } @Override public void onDetectUrlFileFailed(String url, DetectBigUrlFileFailReason failReason) { // 探測一個網路文件失敗了,具體查看failReason } }); // 暫停下載 FileDownloader.pause(url);// 暫停單個下載任務 FileDownloader.pause(urls);// 暫停多個下載任務 FileDownloader.pauseAll();// 暫停所有下載任務 // 繼續下載:自動會斷點續傳(如果伺服器無法支持斷點續傳將從頭開始下載) FileDownloader.start(url); // 移動單個下載文件到新文件夾中 FileDownloader.move(url, newDirPath, mOnMoveDownloadFileListener); // 移動多個下載文件到新文件夾中 FileDownloader.move(urls, newDirPath, mOnMoveDownloadFilesListener); // 重命名下載文件 FileDownloader.rename(url, newName, true, mOnRenameDownloadFileListener); // 刪除單個下載文件 FileDownloader.delete(url, true, mOnDeleteDownloadFileListener); // 刪除多個下載文件 FileDownloader.delete(urls, true, mOnDeleteDownloadFilesListener);