FileDownlaoder
- 支持多任务下载
- 支持多线程下载
- 支持 断点续传
- 使用URLConnection
FileDownloader的基本使用
源码分析
1. singleTask
- 初始化:url:本地存储路径、进度刷新时间间隔、任务状态监听。
- 调用任务start():创建该任务对象锁、任务初始化、并返回任务ID(由url和本地保存路径一起生成的MD5的hashcode )。
- 创建任务:判断当前任务是否已经在任务队列中;
- 将任务加入到线程池中。
- 线程池为自定义的,默认核心线程与最大线程为3,使用LinkedBlockingQueue< Runnable>队列。
2. 多任务下载
就是将每个任务添加到单任务类型的数组中,设置串行还是并行下载、、失败重试次数、启动任务start()就是循环遍历任务数组。
3. 如何实现多线程下载功能?
(后续都假设1个文件启动3个线程去下载)先起一个初始线程(initThread)去查询目标下载文件的基本信息比如文件长度等,生成对应本地文件。计算每个下载线程(DownloadThread)的下载长度和下载起始结束点,通过线程池启动3个下载线程进行下载并写入到本地文件的对应起始点中,当3个下载线程都下载完成后,这个文件就下载完整了。
OkDownload
OkDownload是一个android下载框架,是FileDownloader的升级版本,也称FileDownloader2;是一个支持多线程,多任务,断点续传,可靠,灵活,高性能以及强大的下载引擎。
Android OkDownload的使用
- 使用 okHttp
android自定义实现断点续传
技术点
- 获取下载所配置的信息类
- 本地初始化一个下载信息DownloaderInfor,包括url、存储地址、下载线程数等,保存到本地数据库中。
- 获取下载的文件总长度
- 若为第一次下载,通过get()方法获取文件长度,在头部信息中有contentLength信息(文件byte长度),保存到本地数据库中。
- 若不是第一次,则到本地数据库中查询文件信息,包括配置信息类、文件长度、每块下载的起止点(可能是多线程下载同一文件)、已完成size()。
- 开始下载
- 根据下载信息开启线程进行下载。
- 通过请求头设置欲下载的起止范围。
// 设置范围,格式为Range:bytes x-y;
connection.setRequestProperty("Range", "bytes="+(startPos + compeleteSize) + "-" + endPos);