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