当前位置: 首页 > news >正文

一个Android项目多线程下载模块开源库:AndroidFileDownloader

使用场景
apk应用内更新,其他中小文件的下载,断点续传下载等,先来看看效果图:

simple

简单方便的调用接口
调用者只要设置好下载路径、文件后缀,丢一个url即可开始下载,并且可以根据需要监听进度,例如:


FileDownloader mDownloader = FileDownloader.getInstance(getApplication());
mDownloader.setExtend(".apk");
mDownloader.setFilePath(Environment.getExternalStorageDirectory() + "/apk/");
mDownloader.addFile("http://zhuzher.vanke.com/uip/zhuzher.apk");
mDownloader.setDownloadObserver(new DownloadObserver() {
@Override
public void onUpdate(String apkUrl, String file,
int completeSize, int apkFileSize) {
//do your thing
}
@Override
public void onComplete(String file) {
//do your thing
}
@Override
public void onError(String apkUrl, int type, int state) {
//do your thing
}
});



如果你只关心使用,拿来就用,文章到这里不用往下看了,直接到我的Github仓库下载源码和例子吧。当然我很希望读者一起来理解下简单的实现原理。
设计与实现
多线程下载的实现,生产者消费者模式,对于设计实现层面的东西个人更喜欢用图说明,序列图如下:
getimage1.png
FileDownloader:直接面向调用者,使用者只care文件的url,下载存储路径,下载进度状态,我们致力将对外接口封装的尽量简单方便,所以仅仅提供一个addFile() 方法,传入url,文件路径,回调监听器。
DownloaderListener:下载进度或状态监听接口,调用者实现回调方法处理进度状态。
CreatorThread:生产者线程,这个线程通过url获取文件大小,再将文件分片组装成下载任务段。
TaskList: 任务队列,生产者线程可以往里面增加任务段,消费者线程可以从里面取出一段下载任务,这个过程是同步的。
DownloadThread:消费者线程,负责消费任务队列里面的任务段。

GitHub账号:https://github.com/liuguangli,欢迎fork,贡献你的idea,一起做好每一件小事。

相关文章:

  • Azkaban的Web Server源码探究系列12: 首页之前的跳转
  • 学习之路-现代密码学基础-001
  • 使用hadoop实现关联商品统计
  • 链表的逆置
  • 帧间提取水印
  • 面试遇到的一些题
  • Charles中如何对https抓包
  • 大家一起和snailren学java-(13)字符串
  • 九、搭建织梦cms网站
  • I.MX6 driver goto 使用
  • wcf系列学习5天速成——第四天 wcf之分布式架构
  • 【HBase】start master 与 start master --backup 的区别
  • 【Mongodb】如何创建mongodb的replica set
  • ti processor sdk linux am335x evm /bin/setup-host-check.sh hacking
  • ST:(Lab2)Selenium 实验
  • @jsonView过滤属性
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • Android框架之Volley
  • Asm.js的简单介绍
  • dva中组件的懒加载
  • go append函数以及写入
  • interface和setter,getter
  • Java到底能干嘛?
  • js ES6 求数组的交集,并集,还有差集
  • OSS Web直传 (文件图片)
  • Python socket服务器端、客户端传送信息
  • quasar-framework cnodejs社区
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • vue-cli在webpack的配置文件探究
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 构造函数(constructor)与原型链(prototype)关系
  • 面试总结JavaScript篇
  • 使用 QuickBI 搭建酷炫可视化分析
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 最近的计划
  • 白色的风信子
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #pragma预处理命令
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (pojstep1.1.2)2654(直叙式模拟)
  • (动态规划)5. 最长回文子串 java解决
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (转)为C# Windows服务添加安装程序
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET Framework .NET Core与 .NET 的区别
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 回调、接口回调、 委托
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .Net程序帮助文档制作
  • ??eclipse的安装配置问题!??
  • @ConditionalOnProperty注解使用说明
  • [APIO2012] 派遣 dispatching
  • [AX]AX2012 R2 出差申请和支出报告