demo 下载地址:
https://download.csdn.net/download/u010672559/10549120
1.概述:
此demo是网上参考别人的demo的基础上做的修改实现的多线程断点下载及进度实时更新功能,此demo可直接运行,内部下载apk地址可直接使用,不用自己搭服务器环境,个人觉得直接看代码可能还掌握这个知识点还快点,网上很多贴了很多代码,没实际可运行的demo,自己去调比较费时间,还不如先运行demo看现象,发现demo能需求满足功能,然后再具体看下demo逻辑,自己直接搬过去用效率要高的多,时间多就自己把细节逻辑理解下,方便调具体实际问题及优化逻辑
2.demo操作及逻辑说明:
点击开始下载-显示进度-停止下载-开始下载-下载完成后-点击跳转安装apk
逻辑:点击开始下载-启动线程池去启动多个runable,运行多线程,runable中具体实现单个下载任务,下载的时候每隔一定时间通过数据库去保存各个下载任务里面的下载长度,当中间点击了停止下载时,再次点击开始下载会先去读取保存的下载信息,然后通过保存的下载信息位置处继续下载,下载完成之后接口回调下载完成信息,点击跳转apk可跳转到系统安装apk界面
3.部分逻辑说明:
DownloaderDBHelper和DownloadProgressManager为数据库逻辑
DownloadRunnable为具体下载实现逻辑
FileDownloader为文件下载中间管理对象
DownloadManager启动关闭逻辑
3.1关键代码逻辑解释:
while ((offset = inputStream.read(buffer, 0, 10240)) >0 && !downloadStopFlag && (downloadLength < perThreadMaxDownloadLength)) { threadFile.write(buffer, 0, offset); downloadLength += offset; fileDownloader.appendDownloadSize(offset); }
即不停的读数据,只要没有按下停止下载downloadStopFlag一直为false,然后downloadLength会一直累加,perThreadMaxDownloadLength为每个线程最大下载的长度,即如果下载100M的内容,用5个线程去完成,则每个线程最多只要下载20M即可,当数据读完之后inputStream.read会返回<0的值,fileDownloader.appendDownloadSize(offset)会把每次read的数据传出去,fileDownloader中也有个while循环不停的去记录下载的进度,即UI更新及保存下载进度,然后通过接口传出去给activity更新UI,之后会将每个线程的runable中的读写的实时长度downloadLength保存到数据库中保存起来,fileDownloader中会不停的去检测runable下载完成的标志位有没有置位,如果置位了则表示此线程任务已经完成
3.2MultiThreadTest\app\src\main\java\com\example\wzhang\multithreadtest\multithreaddownload\FileDownloader.java-start()中的Thread.sleep(1000);为UI刷新的间隔时间,修改此值可修改UI更新时间
3.3数据库有两个,一个是保存每个线程的实时下载长度,一个是下载否完成的状态