android-downloader
一个简单的支持多任务下载、多界面管理、可断点下载的网络下载器
最新版 v1.0.0
1.下载器简介
这个下载器是我在写 AppStore 的时候自己搞的玩意,当时为了让多界面同步更新下载所做的东西,但是后来想想觉得应该可以单独拿出来封装,以后用到了就可以直接使用,不需要再做修改什么了,所以才有了这个项目,下载器是以 okhttp 为基础的,不懂 okhttp 也没关系,不过最好还是熟悉下,网上资源很多的 嗯,那么说下它目前的功能吧:
- a.支持多任务下载,具体同时下载几个,最大添加几个任务都是自己可配的
- b.支持多界面监听某个任务,比如像应用市场,多个界面都可以同步下载数据
- c.支持断点下载,我只是实现下载的逻辑,具体怎么断点保存需要开发人员自己做
2.项目引入
在项目的 build.gradle 中加入 repositories{ ... maven {url 'https://jitpack.io' } }
主模块 build.gradle 中引入 compile 'com.github.Dpuntu:android-downloader:v1.0.0'
3.使用下载器
下载器提供了三个比较重要的类 DownloadManager、Downloader 和 Observer 其实很简单,我说下怎么用,大家就明白了 比如说,我现在要下载一个视频叫【韩国美女.mov】,下载的地址是【http://www.dpuntu.com/movie/hgmv.mov】
1.初始化下载器,一般在 Application 中初始化
DownloadManager.initDownloader(this);
2.如果你的网络请求需要额外的配置,比如说请求头需要额外添加信息,你可以初始化 OkHttpClient
OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(你的请求拦截器) .build();当然如果你没有额外的要求,也可以不配置,这一步省略即可
3.配置 Downloader
Downloader mDownloader =new Downloader.Builder() .client(client) //这就是第二部配置的 OkHttpClient,你也可以不配置,下载器内部有个默认的 OkHttpClient .fileName("韩国美女.mov") // 这是你下载的文件需要存储的磁盘上的名字,必须设置项 .filePath("xxx") // 设置文件存储的路径,可省略,默认为根目录下 Android/data/你的 app applicationId/files .loadedSize(mLoadedSize) // 这是下砸文件已经下载的大小,可以不设置,默认是 0,如果是断点的话就必须设置,否则无法断点 .totalSize(mTotalSize) // 这是下载文件的文件总大小,可以不设置,默认是 0,如果是断点的话就必须设置,否则无法断点 .taskId(taskId) //下载文件的任务对应的 id,用于标识单一任务,不可重复,必须设置 .url(“http://www.dpuntu.com/movie/hgmv.mov”) //下载文件的下载地址,必须配置 .build();
4.将第三步设置好的 Downloader 添加到任务列表中
DownloadManager.addDownloader(mDownloader);
5.开始下载任务
DownloadManager.start(taskId); // 这个 taskId 就是设置 Downloader 时候的 taskId
6.如果你关心任务下载情况的话[一般都关心吧...],可设置监听器
DownloadManager.subjectTask(taskId,mStartObserver);// 这个 taskId 就是设置 Downloader 时候的 taskId , mStartObserver 是对>应 taskId 的某一个 Observer,下文具体分析 Observer
从上文来看,建立任务到开始下载是一条链式结构,大概是 4-6 个步骤就完成了,而且 DownloadManager、Downloader 和 Observer 这三个都有使用到,DownloadManager、Downloader 都好理解,大家应该都看得懂,下面讲解下 Observer 这个接口
4.Observer 介绍
其实 Observer 就是观察者模式,也很简单,只是用起来要自己 new 一个而已,稍显复杂,但是当你在多界面监听莫一个任务的时候,你会发现 Observer 的好处,Observer 一共有 6 个方法,下面逐一介绍[注意了 Observer 的回掉均是在 子线程 中]
void onCreate (String taskId) 这个方法是在前面说到的第四步 addDownloader 的时候调用,但是请注意下,如果该任务是第一次创建,则不会触发该方法,所以如果有时候该方法没被调用,不必惊讶
void onReady (String taskId) 这个方法是当你执行上面的第五步的 start 时候调用
void onLoading (String taskId, String speed, long totalSize, long loadedSize) 正在下载过程中回掉 说下参数 taskId (下载任务的 id,就是建立 Downloader 的时候配置的) speed (下载速度) totalSize (下载文件的总大小) loadedSize (下载文件已经下载的大小) 返回 totalSize 和 loadedSize 是为了方便开发者做数据存储,方便以后断点,也可以用来配置下载的百分比
void onPause(String taskId, long totalSize, long loadedSize) 暂停时调用 参数含义同 onLoading 方法
void onFinish(String taskId) 下载任务完成时调用
void onError(String taskId, String error, long totalSize, long loadedSize) 任务下载出现错误时候调用 参数含义同 onLoading 参数 error 是错误的提示信息
5.DownloadManager 方法说明
- void initDownloader(Context context) // 初始化下载器
- int getCorePoolSize() // 获取下载器最大同时下载的任务数量
- void setCorePoolSize(int corePoolSize) // 设置下载器最大同时下载的任务数量
- int getMaxPoolSize() // 获取下载器最多添加的任务数量
- void setMaxPoolSize(int maxPoolSize) // 设置下载器最多添加的任务数量
- long getKeepAliveTime() // 空闲任务的存活时间,单位毫秒
- void setKeepAliveTime(int keepAliveTime)// 设置空闲任务的存活时间,单位毫秒
- void addDownloader(T t) // 添加任务到任务队列 T 只能是 Downloader 或者 List
类型 - void remove(T t) // 移除任务队列中的某个任务或一群任务 ,T 可以是任务的 id, 也可以是任务 id 的 List 集合
- void removeAll()// 移除任务队列中所有的任务
- void pause(T t)// 暂停任务队列中的某个任务或一群任务,T 可以是任务的 id, 也可以是任务 id 的 List 集合
- void pauseAll()// 暂停任务队列中所有的任务
- void start(T t)// 开始任务队列中的某个任务或一群任务,T 可以是任务的 id, 也可以是任务 id 的 List 集合
- void startAll()//开始任务队列中所有的任务
- void subjectTask(String taskId,Observer observer) // 给某个任务绑定一个观察者
- void removeTaskObserver(String taskId,Observer observer)// 移除某个任务的某个观察者
- Downloader getDownloader(String taskId) // 获得某个任务的下载信息
最后非常重要的
不要忘记加网络以及读写权限
