Android實現(xiàn)多線程斷點下載
QDownload
QDownload是基于Android平臺實現(xiàn)的下載框架。API簡潔易上手,只需5分鐘即可實現(xiàn)一個多任務、多線程、斷點下載的功能
支持功能如下:
支持多個下載任務同時下載單個任務支持開多個線程下載支持斷點下載,在斷網(wǎng)、進程被劃掉可恢復下載自動校驗服務器文件服務器是否支持斷點下載,如果不支持則會開啟單線程任務下載支持應用全局監(jiān)聽下載進度回調(diào)支持下載速度顯示支持添加下載任務,暫停下載,恢復下載,取消下載支持批量暫停,批量恢復下載
先貼個效果圖
主頁

多任務多線程斷點下載頁面

1、如何使用
1.1、導入依賴
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) {}
//暫停所有任務
public static void pauseAll() {}
//恢復下載
public static void resume(DownloadEntry entry) {}
//恢復所有任務
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;//任務狀態(tài)
public HashMap<Integer, Long> ranges;//存儲每個線程下載開始區(qū)塊
public int speed;//下載速度 單位s
}
其中state有如下幾個值
public enum State {
IDLE,//空閑
CONNECT,//連接中(用戶預取文件信息)
ING,//下載中
PAUSED,//已暫停
CANCELLED,//已取消
ERROR,//錯誤
DONE,//完成
WAIT//等待
}
1.5、下載相關(guān)的操作
添加一個下載
通過DownloadEntry構(gòu)建下載實體
public void addDownload(String id,String url){
//id為任務的一個唯一標識,url為文件地址
DownloadEntry entry = DownloadEntry.obtain(id,url)
//添加一個下載任務
DownloadManager.add(entry)
}
暫停下載
可通過下載任務id 然后調(diào)用DownloadManager.findById(id) 函數(shù)獲取DownloadEntry
public void pauseDownload(DownloadEntry entry){
//添加一個下載任務
DownloadManager.pause(entry)
}
恢復下載
public void resumeDownload(DownloadEntry entry){
//添加一個下載任務
DownloadManager.resume(entry)
}
暫停所有下載任務
public void pauseAll(DownloadEntry entry){
//添加一個下載任務
DownloadManager.resume(entry)
}
恢復所有下載任務
public void recoverAll(DownloadEntry entry){
//添加一個下載任務
DownloadManager.recoverAll(entry)
}
1.6、應用市場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)) {
//如果服務端沒有返回唯一標記則用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){
//這四種情況:沒有下載任務 || 任務是暫停 || 下載失敗 || 任務已被取消
DownloadManager.add(entry)
}
}
暫停apk下載
public void pauseDownloadApk(ApkEntry apkEntry){
//1、先check當前apk是否在下載任務中
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)文章
Android4.0開發(fā)之Keyguard解鎖屏機制詳解
這篇文章主要介紹了Android4.0開發(fā)之Keyguard解鎖屏機制,結(jié)合實例形式詳細分析了Android開發(fā)中Keyguard解鎖屏模塊的原理、使用方法與相關(guān)操作注意事項,需要的朋友可以參考下2017-12-12
Android巧用DecorView實現(xiàn)對話框功能
本篇文章主要介紹了Android巧用DecorView實現(xiàn)對話框功能,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
Android Studio多工程引用同一個library項目配置的解決方法
大家在使用android studio的時候,會遇到多個項目引用相同的library這篇文章主要介紹了Android Studio多工程引用同一個library項目配置方法,需要的朋友可以參考下2018-03-03
一文帶你了解Android?Flutter中Transform的使用
flutter的強大之處在于,可以對所有的widget進行Transform,因此可以做出非??犰诺男Ч?。本文就來大家了解一下Transform的具體使用,感興趣的可以了解一下2023-01-01
Android SharePreferences與數(shù)據(jù)庫SQLite存儲實現(xiàn)方法介紹
這篇文章主要介紹了Android SharePreferences與數(shù)據(jù)庫SQLite用于存儲的具體實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2022-09-09

