Android多任务、断点下载器

好久都没有更新文章了,感觉自己快要与世隔绝了,主要是一直没机会写文章,最近闲下来了,就把前段时间做的项目中一个网络下载器拿出来封装下,方便以后使用

地址 android-downloader

1.下载器简介

这个下载器是我在写AppStore的时候自己搞的玩意,当时为了让多界面同步更新下载所做的东西,但是后来想想觉得应该可以单独拿出来封装,以后用到了就可以直接使用,不需要再做修改什么了,所以才有了这个项目,下载器是以okhttp为基础的,不懂okhttp也没关系,不过最好还是熟悉下,网上资源很多的
嗯,那么说下它目前的功能吧:

a.支持多任务下载,具体同时下载几个,最大添加几个任务都是自己可配的
b.支持多界面监听某个任务,比如像应用市场,多个界面都可以同步下载数据
c.支持断点下载,我只是实现下载的逻辑,具体怎么断点保存需要开发人员自己做

2.项目引入

在项目的 build.gradle 中加入
    repositories{
            。。。
            maven {url 'https://jitpack.io' }
    }

主模块 build.gradle 中引入
      compile 'com.github.Dpuntu:android-downloader:1.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个步骤就完成了,而且DownloadManagerDownloaderObserver这三个都有使用到,DownloadManagerDownloader都好理解,大家应该都看得懂,下面讲解下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<Downloader>类型
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) // 获得某个任务的下载信息

6.实际使用

前面都是理论,下面实践一次,就下载一个 韩国美女.mov 吧
实例传送门

如果在使用过程中遇到任何问题,请及时告知,感谢大家支持

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容