首先声明一点: 这里的多线程下载 并非指的 多个线程下载一个 文件。而是 每一个线程 负责一个文件。

真正的多线程 希望后面能给大家带来。

 -------------  欢迎 爱学习的小伙伴 加群  -------------

 -------------android交流群:230274309-------------

-------------一起分享。一起进步!

须要你们--------------

--------------  期待各位爱学习的小伙伴们 的到来--------------

本文是接着前面http://blog.csdn.net/u011733020/article/details/47016715继续写的。

感兴趣的小伙伴 能够看前面的。

界面效果

2015/7/31改进

2015/7/31 日 先说 这次 改进了两点。

第一点 ,前面说过 项目 仅仅适合学习,作为商用的话, 效率不高,是由于 当时  点击暂停 ,在点击下载 继续下载时候。假设文件前面下载部分较大。会比較慢, 由于  java 的 inputstream  的 skip(long  size) 跳过字节 这种方法 并不能依照你 想要跳过的字节,而是 跳过的 往往是比較小的。所以 要不断遍历,直到 返回满足 条件 ,比較耗时。打个例如, 文件大小 30M 。你下载了20M。你点了暂停 然后继续点下载。就要跳过这20M,可是你用skip 方法 可能每次跳过 4096 字节,这样 要跳过20M  的时间 就会非常长。这样应该好理解。

第二点,原来 项目中, 你这一次下载没有完毕。下次在下载是 删除掉原来的 从新 下载。这次 改成继续上次的地方 接着下载。

吐槽下。关于下载,我近期一周 一直在看 开源的download, 可是 无奈水平有限,收获甚微。往往是看到最后 脑袋短路。

这次改的方式比較简单,仅仅修改了 项目中 DownloadManager 这个类。在来看下 DownloadManager  这个类 的run 方法,

@Override
public void run() {
info.setDownloadState(STATE_DOWNLOADING);// 先改变下载状态
notifyDownloadStateChanged(info);
File file = new File(info.getPath());// 获取下载文件
HttpResult httpResult = null;
InputStream stream = null;
if (info.getCurrentSize() == 0 || !file.exists()
|| file.length() != info.getCurrentSize()) {
// 假设文件不存在,或者进度为0,或者进度和文件长度不相符,就须要又一次下载
info.setCurrentSize(0);
file.delete();
}
httpResult = HttpHelper.download(info.getUrl());
if (httpResult == null
|| (stream = httpResult.getInputStream()) == null) {
info.setDownloadState(STATE_ERROR);// 没有下载内容返回。修改为错误状态
notifyDownloadStateChanged(info);
} else {
try {
skipBytesFromStream(stream, info.getCurrentSize());
} catch (Exception e1) {
e1.printStackTrace();
}
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file, true);
int count = -1;
byte[] buffer = new byte[1024];
while (((count = stream.read(buffer)) != -1)
&& info.getDownloadState() == STATE_DOWNLOADING) {
// 每次读取到数据后,都须要推断是否为下载状态,假设不是,下载须要终止,假设是。则刷新进度
fos.write(buffer, 0, count);
fos.flush();
info.setCurrentSize(info.getCurrentSize() + count);
notifyDownloadProgressed(info);// 刷新进度
}
} catch (Exception e) {
info.setDownloadState(STATE_ERROR);
notifyDownloadStateChanged(info);
info.setCurrentSize(0);
file.delete();
} finally {
IOUtils.close(fos);
if (httpResult != null) {
httpResult.close();
}
}
// 推断进度是否和app总长度相等
if (info.getCurrentSize() == info.getAppSize()) {
posted @
2017-05-15 11:18 
llguanli 
阅读(...) 
评论(...) 
编辑 
收藏

最新文章

  1. JAVA通信系列三:Netty入门总结
  2. JavaScript浮动广告代码,容纯DIV/CSS对联漂浮广告代码,兼容性非常好的js右下角与漂浮广告代码
  3. iOS之 APNs全新的APNs苹果15年WWDC大会上的干货
  4. IOS Application Security Testing Cheat Sheet
  5. RequiredFieldValidator 控件 CompareValidator 控件
  6. Thread IsBcakgroud
  7. ie6 z-index(用父元素的优先级来解决)
  8. Presto架构及原理
  9. 【转】跟着开涛学SpringMVC
  10. SQLBulkCopy使用
  11. Jrtplib
  12. HTML5 微信二维码提示框
  13. 在DataTable和DataView中查找指定记录
  14. 怎样实现IOS开发中的数据存储方式
  15. 4.如何实现用MTQQ通过服务器实现订阅者和发布者的通讯
  16. Java中的ASCII码与Unicode码
  17. virsh详解
  18. 2018宁夏邀请赛网赛 I. Reversion Count(java练习题)
  19. java实验二——输出一个指定整数的所有质因数
  20. MAC 系统 各种操作

热门文章

  1. 【Luogu】P2219修筑绿化带(单调队列)
  2. mybatis学习(十一)——springmvc++spring+mybatis整合
  3. 关于console.log() 打印得引用类型得数据得相关问题
  4. 线段树懒标记好题 HDU4578
  5. 【Linux】多进程与多线程之间的区别
  6. js 时间戳与yyyy-mm-dd或yyyy-MM-dd HH-mm-ss互相转换
  7. Java 界面编程【02】事件注册
  8. PostgreSQL 二进制安装
  9. 作为程序员,再也不想和PM干架了
  10. [Violet 4] 毕业旅行