熟悉漫威電影的人都知道Jarvis,他是鋼鐵俠的智能管家,幫助鋼鐵俠製造裝甲、分析大量數據、協助建模等各類智能工做,惋惜在復聯2中,Jarvis與靈魂寶石共同結合成Vision,鋼鐵俠失去了這位如親人通常的智能AI,後來Tony用F.R.I.D.A.Y代替了Jarvis的工做,但從鋼鐵俠與Friday的互動來看,他只把Friday當作通常的AI,並無投入如對待Jarvis的感情。java
最近復聯3上映,中國沒有同步上映,真的太惋惜了,五一原本還想過去香港看,但想到到時會人生人海仍是算了,因此假期閒餘時間就擼了個JarvisDownloader,之因此以Jarvis命名,也是由於我太喜歡Jarvis這個AI了,它屬於人工智能的頂端啊!JarvisDownloader雖然沒有Jarvis那麼強大,但在下載文件方面,具有了不少的優勢。git
gradlegithub
repositories {
maven{
url "https://jitpack.io"
}
}
dependencies {
api 'com.github.yuwenque:JarvisDownloader:0.4.0'
}
複製代碼
Jarvis.init(new DefaultDownloadHistoryDBHelper(applicationContext));
複製代碼
你也能夠自定義一個繼承於AbsDownloadHistoryDBHelper的管理類,用於保存下載進度等操做,詳細操做請參考DefaultDownloadHistoryDBHelper數據庫
請在activity或service中調用api
//構成下載器
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) {
}
});
複製代碼
上述代碼也能夠簡化成如下形式bash
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.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服務器