JarvisDownloader
熟悉漫威電影的人都知道Jarvis,他是鋼鐵俠的智慧管家,幫助鋼鐵俠製造裝甲、分析大量資料、協助建模等各種智慧工作,可惜在復聯2中,Jarvis與靈魂寶石共同結合成Vision,鋼鐵俠失去了這位如親人一般的智慧AI,後來Tony用F.R.I.D.A.Y代替了Jarvis的工作,但從鋼鐵俠與Friday的互動來看,他只把Friday當做一般的AI,並沒有投入如對待Jarvis的感情。
最近復聯3上映,中國沒有同步上映,真的太可惜了,五一本來還想過去香港看,但想到到時會人生人海還是算了,所以假期閒餘時間就擼了個JarvisDownloader,之所以以Jarvis命名,也是因為我太喜歡Jarvis這個AI了,它屬於人工智慧的頂端啊!JarvisDownloader雖然沒有Jarvis那麼強大,但在下載檔案方面,具備了很多的優點。
主要功能
- 支援斷點續傳下載
- 支援自定義資料夾路徑、檔名。
- 支援自定義SQLiteOpenHelper,用於儲存下載進度等
- 下載進度回撥時自動切換到UI執行緒,方便更新UI。
- 自動與activity繫結生命週期,無需手動釋放
- activity不可見時,不會更新UI,可見時會自動恢復狀態
- 支援查詢下載歷史列表
- 自定義請求頭
使用JarvisDownloader
依賴遠端庫
gradle
repositories {
maven{
url "https://jitpack.io"
}
}
dependencies {
api 'com.github.yuwenque:JarvisDownloader:0.4.0'
}
複製程式碼
初始化資料庫
Jarvis.init(new DefaultDownloadHistoryDBHelper(applicationContext));
複製程式碼
你也可以自定義一個繼承於AbsDownloadHistoryDBHelper的管理類,用於儲存下載進度等操作,詳細操作請參考DefaultDownloadHistoryDBHelper
Jarvis.Downloader構建下載任務
請在activity或service中呼叫
//構成下載器
Jarvis.Downloader downloader = Jarvis.with(this).withUrl("http://pic1.win4000.com/wallpaper/2017-10-11/59dde2bca944f.jpg");
//是否允許ui不可見時繼續下載
downloader.allowBackgroundDownload(true);
//多執行緒下載數量
downloader.threadCount(3);
//設定下載目錄,非必須,預設目錄為 Environment.getExternalStorageDirectory()+File.separator+"Jarvis"
downloader.filePath(Environment.getExternalStorageDirectory() + File.separator + "Jarvis");
//設定檔名,非必須,但建議手動設定,預設為伺服器檔案的名字
downloader.fileName("test.jpg");
//重新整理進度的頻率(毫秒),最小值為100
downloader.refreshTime(1000);
//設定狀態監聽
//假如當前context為activity的話Jarvis已經自動幫你回撥到主執行緒了,不需要呼叫activity.runOnUiThread
downloader.setDownloadListener(new DownloadListener() {
/**
* 檔案下載完畢回撥
* @param file
*/
@Override
public void onSuccess(File file) {
}
/**
* 進度回撥
* @param downloadedSize 當前下載的檔案大小
* @param progress 當前進度 0-1.0
*/
@Override
public void onProgress(long downloadedSize, float progress) {
}
/**
* 開始下載時
*/
@Override
public void onStart() {
}
/**
* 下載暫停時
*/
@Override
public void onPause() {
}
/**
* 下載失敗時
*/
@Override
public void onFail() {
}
/**
* 被刪除時
* @param b 刪除成功標誌位
*/
@Override
public void onDelete(boolean b) {
}
});
//增加額外的請求頭
downloader.addExtraRequestProperty("test-key","test-value");
//多個請求頭時,可新增map
Map<String,String> map = new HashMap<>();
map.put("test1","value1");
map.put("test2","value2");
downloader.addExtraRequestPropertyMap(map);
//開始下載
downloader.download();
//手動暫停
downloader.pause();
//恢復下載
downloader.recovery();
//手動刪除本地記錄,但不刪除檔案,檔案下載過程中不允許刪除
downloader.delete();
//刪除下載記錄以及檔案,檔案下載過程中不允許刪除
downloader.deleteCacheFile();
//獲取當前的下載狀態
downloader.getDownloadState();
//同步獲取上次下載的進度,由於是查詢資料庫的操作,所以建議新開執行緒來獲取
downloader.getDownloadedProgress();
//非同步獲取下載進度
downloader.getDownloadedProgress(new DataCallBack<Float>() {
@Override
public void onData(Float progress) {
}
});
複製程式碼
上述程式碼也可以簡化成以下形式
Jarvis.with(this)
.withUrl("http://pic1.win4000.com/wallpaper/2017-10-11/59dde2bca944f.jpg")
.allowBackgroundDownload(true)
.threadCount(3)
.filePath(Environment.getExternalStorageDirectory() + File.separator + "Jarvis")
.fileName("test.jpg")
.refreshTime(1000)
.setDownloadListener(listener).download();
複製程式碼
Jarvis管理下載任務
//非同步獲取下載歷史記錄,下載進度請自己計算
Jarvis.getInstance().getDownloadedList(new DataCallBack<List<LocalFileRecordBean>>() {
@Override
public void onData(List<LocalFileRecordBean> localFileRecordBeans) {
LocalFileRecordBean fileRecordBean= localFileRecordBeans.get(0);
//下載進度
float progress = fileRecordBean.getDownloadedLength()*1.0f/fileRecordBean.getFileTotalLength();
}
});
//停止所有下載任務
Jarvis.getInstance().pauseAllDownloader();
//開始所有下載任務
Jarvis.getInstance().startAllDownload();
//刪除所有下載任務及檔案
Jarvis.getInstance().forceDeleteAll();
//設定下載的執行緒池長度,如果當前有10個下載任務,
//每個任務開啟3個執行緒進行斷點續傳下載,那麼此時只設定20個的話,將有部分下載任務需等待其他執行緒執行完任務才能開始
Jarvis.getInstance().initThreadPoolLength(20);
複製程式碼
原始碼閱讀請跳轉到https://github.com/yuwenque/JarvisDownloader