JarvisDownloader

More: Author   ReportBugs   
Tags:
下载管理-

熟悉漫威电影的人都知道 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.arestory: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);
Apps
About Me
GitHub: Trinea
Facebook: Dev Tools