Android斷點續傳下載器JarvisDownloader

YWQ發表於2018-05-01

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那麼強大,但在下載檔案方面,具備了很多的優點。

jarvis.gif

主要功能

  • 支援斷點續傳下載
  • 支援自定義資料夾路徑、檔名。
  • 支援自定義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

相關文章