file-downloader
FileDownloader(https://github.com/wlfcolin/file-downloader)是本人開源的一個安卓Http文件下載框架,是根據自己的經驗總結的一套非常輕量級的安卓通用Http文件下載管理器。我的目標是讓文件下載越簡單越好,盡可能以最簡潔明了的方式完成復雜需求。亦可以查看github上的最新中文描述
一、特點
-
多任務並行下載、自動斷點續傳、失敗自動重試機制、支持大文件(超過2G)下載、強大方便的異常處理和異常恢復機制、輕松管理下載文件的生命周期(下載文件的增刪改查)等。
二、非常適合的使用場景
-
1、需要多頁面多方位同步下載進度和下載狀態(比如商店APP,A頁面開啟點擊下載,B頁面和C頁面也可以看到下載進度和暫停這個下載,而D頁面 可以刪除這個下載,無論哪個頁面有操作,其它頁面都會收到響應的回調進行更新,並且還可能還需要常駐一個service來把下載情況同步發送到通知欄的)
-
2、需要斷點續傳節約流量(比如做批量應用更新APP、單個應用自己更新下載新版本、做影視需要批量緩存視頻的APP,做MP3歌曲下載APP)
-
3、專門做下載的(比如迅雷之類的APP,需要下載任何服務器上的東西,並且兼顧下載效率和開發效率的)
三、截圖
四、快速上手使用
-
第一步、在項目模塊的build.gradle配置gradle
compile 'org.wlf:FileDownloader:0.3.1'
eclipse用戶,可以在這里下載jar包: FileDownloader-0.3.1.jar, FileDownloader-0.3.1-sources.jar
-
第二步、在你的應用application的onCreate()中初始化FileDownloader
// 1、創建Builder Builder builder = new FileDownloadConfiguration.Builder(this); // 2.配置Builder // 配置下載文件保存的文件夾 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);
-
第三步、注冊監聽器(如果不需要監聽,可以忽略),監聽器是基於觀察者模式設計的全局監聽器,可以設置多個,記得在不需要的時候取消注冊
- -注冊下載狀態監聽器(一般在fragment或activity的onCreate方法中注冊,如果你使用service,請查看在Service中使用FileDownloader)
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.getType()會是一樣的 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() } }; FileDownloader.registerDownloadStatusListener(mOnFileDownloadStatusListener);
- -注冊文件數據變化監聽器,監聽比如文件不存在了,被刪除了,狀態變化了等任何與文件數據變化相關都會收到通知
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) { // 一個下載文件被刪除,也許你需要同步你自己的數據存儲,比如在你的業務數據庫中刪除一條記錄 } }; FileDownloader.registerDownloadFileChangeListener(mOnDownloadFileChangeListener);
下載狀態監聽器和文件數據變化監聽器的主要區別在於,前者關心下載進度和錯誤(前端UI),后者關心文件數據變化(數據存儲)
-
第四步、下載文件和管理文件
- -創建一個新下載
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.delete(url, true, mOnDeleteDownloadFileListener);// 刪除單個下載文件 FileDownloader.delete(urls, true, mOnDeleteDownloadFilesListener);// 刪除多個下載文件
- -重命名下載文件
FileDownloader.rename(url, newName, true, mOnRenameDownloadFileListener);// 重命名一個下載文件
-
第五步、取消注冊的監聽器
- -取消注冊下載狀態監聽器(一般在fragment或activity的onDestroy方法中取消注冊)
FileDownloader.unregisterDownloadStatusListener(mOnFileDownloadStatusListener);
- -取消注冊文件數據變化監聽器
FileDownloader.unregisterDownloadFileChangeListener(mOnDownloadFileChangeListener);
五、詳細API文檔
六、版本更新日志
歡迎加入QQ討論群:479868413