Android實現(xiàn)多線程斷點下載
QDownload
QDownload是基于Android平臺實現(xiàn)的下載框架。API簡潔易上手,只需5分鐘即可實現(xiàn)一個多任務(wù)、多線程、斷點下載的功能
支持功能如下:
支持多個下載任務(wù)同時下載單個任務(wù)支持開多個線程下載支持斷點下載,在斷網(wǎng)、進程被劃掉可恢復(fù)下載自動校驗服務(wù)器文件服務(wù)器是否支持斷點下載,如果不支持則會開啟單線程任務(wù)下載支持應(yīng)用全局監(jiān)聽下載進度回調(diào)支持下載速度顯示支持添加下載任務(wù),暫停下載,恢復(fù)下載,取消下載支持批量暫停,批量恢復(fù)下載
先貼個效果圖
主頁
多任務(wù)多線程斷點下載頁面
1、如何使用
1.1、導(dǎo)入依賴
implementation 'com.qw.download:download:1.0.0-alpha01'
1.2、初始化下載組件
public class MyApplication extends Application{ @Override public void onCreate() { super.onCreate(); //初始化下載組件(可在子線程中做) DownloadManager.init(this); } }
1.3、核心控制器DownloadManager
api如下
public class DownloadManager { private static DownloadManager mInstance; private final Context context; private DownloadManager(Context context) {} //初始化組件 public static void init(Context context) {} //開啟下載 public static void add(DownloadEntry entry) {} //暫停下載 public static void pause(DownloadEntry entry) {} //暫停所有任務(wù) public static void pauseAll() {} //恢復(fù)下載 public static void resume(DownloadEntry entry) {} //恢復(fù)所有任務(wù) public static void recoverAll() {} }
1.4、監(jiān)聽下載進度
需要監(jiān)聽下載進度可通過注冊DownloadWatcher來監(jiān)聽下載信息的變化
private DownloadWatcher watcher = new DownloadWatcher() { @Override protected void onDataChanged(DownloadEntiry entry) { //這里監(jiān)聽下載的實時信息 mDownloadInfoLabel.setText(entry.toString()); Log.e("MainActivity", entry.toString()); } }; @Override protected void onResume() { super.onResume(); //注冊觀察者 DownloadManager.addObserver(watcher); } @Override protected void onPause() { super.onPause(); //移除觀察者 DownloadManager.removeObserver(watcher); }
其中第3行 DownloadEntiry entry
存儲了下載相關(guān)信息
public class DownloadEntry implements Serializable { public String id;//下載的唯一標識 public String url;//下載文件的url地址 public boolean isSupportRange;//是否支持斷點續(xù)傳 public long contentLength;//文件長度 public long currentLength;//已下載文件長度 public State state;//任務(wù)狀態(tài) public HashMap<Integer, Long> ranges;//存儲每個線程下載開始區(qū)塊 public int speed;//下載速度 單位s }
其中state有如下幾個值
public enum State { IDLE,//空閑 CONNECT,//連接中(用戶預(yù)取文件信息) ING,//下載中 PAUSED,//已暫停 CANCELLED,//已取消 ERROR,//錯誤 DONE,//完成 WAIT//等待 }
1.5、下載相關(guān)的操作
添加一個下載
通過DownloadEntry構(gòu)建下載實體
public void addDownload(String id,String url){ //id為任務(wù)的一個唯一標識,url為文件地址 DownloadEntry entry = DownloadEntry.obtain(id,url) //添加一個下載任務(wù) DownloadManager.add(entry) }
暫停下載
可通過下載任務(wù)id 然后調(diào)用DownloadManager.findById(id)
函數(shù)獲取DownloadEntry
public void pauseDownload(DownloadEntry entry){ //添加一個下載任務(wù) DownloadManager.pause(entry) }
恢復(fù)下載
public void resumeDownload(DownloadEntry entry){ //添加一個下載任務(wù) DownloadManager.resume(entry) }
暫停所有下載任務(wù)
public void pauseAll(DownloadEntry entry){ //添加一個下載任務(wù) DownloadManager.resume(entry) }
恢復(fù)所有下載任務(wù)
public void recoverAll(DownloadEntry entry){ //添加一個下載任務(wù) DownloadManager.recoverAll(entry) }
1.6、應(yīng)用市場apk下載的一個場景
ApkEntry實體數(shù)據(jù)用來描述apk的基本信息
public class ApkEntry { public String id;//包id public String cover;//apk 圖標 public String name;//apk 名稱 public String url;//apk 下載地址 public long length;//apk 大小 public String id() { if (TextUtils.isEmpty(id)) { //如果服務(wù)端沒有返回唯一標記則用url的md5值作為下載唯一標識 id = FileUtilities.getMd5FileName(url); } return id; } }
這是我要下載這個apk就可以這么做
public void downloadApk(ApkEntry apkEntry){ //1、先check當前apk是否在下載 DownloadEntry entry = DownloadManager.findById(apkEntry.id()) if(entry==null || entry.state==State.PAUSED || entry.state==State.ERROR || entry.state==State.CANCELLED){ //這四種情況:沒有下載任務(wù) || 任務(wù)是暫停 || 下載失敗 || 任務(wù)已被取消 DownloadManager.add(entry) } }
暫停apk下載
public void pauseDownloadApk(ApkEntry apkEntry){ //1、先check當前apk是否在下載任務(wù)中 DownloadEntry entry = DownloadManager.findById(apkEntry.id()) if(entry!=null){ DownloadManager.pause(entry) } }
總結(jié)
到此這篇關(guān)于Android實現(xiàn)多線程斷點下載的文章就介紹到這了,更多相關(guān)Android多線程斷點下載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android橫豎屏切換及其對應(yīng)布局加載問題詳解
這篇文章主要為大家詳細介紹了Android橫豎屏切換及其對應(yīng)布局加載問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-04-04Android4.0開發(fā)之Keyguard解鎖屏機制詳解
這篇文章主要介紹了Android4.0開發(fā)之Keyguard解鎖屏機制,結(jié)合實例形式詳細分析了Android開發(fā)中Keyguard解鎖屏模塊的原理、使用方法與相關(guān)操作注意事項,需要的朋友可以參考下2017-12-12Android巧用DecorView實現(xiàn)對話框功能
本篇文章主要介紹了Android巧用DecorView實現(xiàn)對話框功能,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04Android Studio多工程引用同一個library項目配置的解決方法
大家在使用android studio的時候,會遇到多個項目引用相同的library這篇文章主要介紹了Android Studio多工程引用同一個library項目配置方法,需要的朋友可以參考下2018-03-03一文帶你了解Android?Flutter中Transform的使用
flutter的強大之處在于,可以對所有的widget進行Transform,因此可以做出非??犰诺男Ч?。本文就來大家了解一下Transform的具體使用,感興趣的可以了解一下2023-01-01Android SharePreferences與數(shù)據(jù)庫SQLite存儲實現(xiàn)方法介紹
這篇文章主要介紹了Android SharePreferences與數(shù)據(jù)庫SQLite用于存儲的具體實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2022-09-09