背景

万事都有两面性,多线程下载也是,那么多线程下载的优点是什么呢?归根结底还是多线程的优点,这里我们暂且不去讨论它的利弊,只是讲解一下思想和实现方案。

实现分析

我们用五个why的思想来分析一下这个问题:
1. 怎么实现多线程下载?
将下载逻辑在多个线程中同时运行。
2. 怎么让每个线程下载对应的文件?
将文件拆分成线程数对应的分数,进行分配。
3. 怎么拆分文件?
获取文件的长度,再按照线程数进行按比例分配。
4. 怎么获取文件长度?
利用HttpURLConnection的方法来获取内容长度
5. 下载完成之后怎么办?
各个线程都下载完成之后利用RandomAccessFile进行文件合并

好了,分析到这我们感觉已经可以实现了,我们再重新梳理一下逻辑,大概是,设定线程的数量,按照线程数量来分割要下载的文件,启动多个线程进行下载,最后合成一个文件。OK,撸起袖子就是干!

代码实现

1、设置线程数,我这边是默认指定了三个,大家也可以通过服务器配置啊,或者某些算法来计算需要的线程数,根据实际情况来定。
2、获取文件长度:

  URL url = new URL(file.url);HttpURLConnection con = (HttpURLConnection)url.openConnection();con.setRequestMethod("GET");con.setConnectTimeout(5000);if(con.getResponseCode() ==  HttpURLConnection.HTTP_OK) {int len = con.getContentLength(); //文件的总长度}

这样我们就获取到了文件的长度,然后就可以分割下载了,当然之前我们要初始化一些路径啊,RandomAccessFile什么的,大家可以下载源码查看。
3、分割文件内容:

        List<ThreadInfo> threadInfoList = new LinkedList<ThreadInfo>(); //建立线程信息列表int block = mDownloadInfo.lenght/mThreadCount; //将下载文件分段if(block > 0) {//start 根据线程数量分别建立线程信息for(int i = 0;i < mThreadCount;i++) {ThreadInfo info = new ThreadInfo(i,mDownloadInfo.url,i*block,(i+1)*block-1,0);if(i == mThreadCount -1) {info.end = mDownloadInfo.lenght; //分段最后一个,结束位置到文件总长度末尾}threadInfoList.add(info);         //加入列表}//end 根据线程数量分别建立线程信息

4、启动下载线程:

        //start 启动下载线程for(ThreadInfo info : threadInfoList) {DownloadThread thread = new DownloadThread(info,mDownloadInfo,mTotalFinished);if(!mThreadPool.isShutdown()) {mThreadPool.execute(thread);}}

5、下载的逻辑和RandomAccessFile最后生成一个完整的文件:

    public void run() {URL url = null;HttpURLConnection con = null;      //http链接RandomAccessFile accessFile = null; //下载文件InputStream inputStream = null;      //输入流try {int start = threadInfo.start+threadInfo.finished; //读取文件的位置//start 初始化下载链接url = new URL(threadInfo.url);con = (HttpURLConnection) url.openConnection();con.setRequestMethod("GET");con.setConnectTimeout(5000);con.setRequestProperty("Range", "bytes=" + start + "-" + threadInfo.end); //设置读取文件的位置,和结束位置//end 初始化下载链接//start 初始化下载到本地的文件accessFile  = new RandomAccessFile(new File(downloadInfo.filePath, downloadInfo.fileName),"rwd");accessFile.seek(start);    //设置开始写入的位置//end 初始化下载到本地的文件int responseCode = con.getResponseCode();if((con.getResponseCode() == HttpURLConnection.HTTP_PARTIAL) ||(con.getResponseCode() == HttpURLConnection.HTTP_OK) ) {inputStream = con.getInputStream();int finished = threadInfo.finished;               //已经下载的长度int readLen = -1;                                       //读取的长度byte[] buffer = new byte[1024*4];long time = System.currentTimeMillis();//start 读取输入流写入文件while((readLen = inputStream.read(buffer))!=-1) {accessFile.write(buffer, 0, readLen););}} catch (MalformedURLException e) {e.printStackTrace();} catch (ProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {try {if(inputStream!=null){inputStream.close();}if(accessFile!=null) {accessFile.close();}if(null!=con) {con.disconnect();}} catch (IOException e) {e.printStackTrace();}}super.run();}

总结

好了,主要下载逻辑就是这样,大家想看完整代码的可以点击下面的链接,希望大家可以喜欢,谢谢!
源码下载

Android多线程下载相关推荐

  1. android 多线程下载,断点续传,线程池

    android 多线程下载,断点续传,线程池 你可以在这里看到这个demo的源码: https://github.com/onlynight/MultiThreadDownloader 效果图 这张效 ...

  2. 更好的Android多线程下载框架

    /*** 作者:Pich* 原文链接:http://me.woblog.cn/* QQ群:129961195* Github:https://github.com/lifengsofts*/ 概述 为 ...

  3. Android多线程下载断点续传

    先上图看卡结果: GITHUB:Android多线程下载断点续传 下载杵这儿 如图所示点击下载就开始下载,点击停止就会停止再次点击下载就会接着下载了. 设计思路是这样的: 首先通过广播将下载信息传递给 ...

  4. Android -- 多线程下载

    因为Android应用程序是java写的,基本上很多java写的程序都可以直接照搬到Android上面,移植性非常Good.这里讲一下多线程下载,就是每个线程都下载自己的那部分,那么就需要平均分配分割 ...

  5. android多线程下载原理,安卓多线程断点续传下载功能(靠谱第三方组件,原理demo)...

    一,原生的DownloadManager 从Android 2.3(API level 9)开始,Android以Service的方式提供了全局的DownloadManager来系统级地优化处理长时间 ...

  6. *Android 多线程下载 仿下载助手(改进版)

    首先声明一点: 这里的多线程下载 并不是指的 多个线程下载一个 文件,而是 每个线程 负责一个文件.真正的多线程 希望后面能给大家带来.  -------------  欢迎 爱学习的小伙伴 加群   ...

  7. android多线程下载程序卡死,android 多线程下载与断点续传

    多线程下载: 下载速度更快,服务器对每个线程平分资源,故线程越多,得到的资源越多,下载速度越快. 断点续传: 下载中断,再次下载时从上一次下载结束的位置开始下载,防止重复下载 下载结束后 代码: pa ...

  8. android多线程下载3

    今天跟大家一起分享下android开发中比较难的一个环节,可能很多人看到这个标题就会感觉头很大,的确如果没有良好的编码能力和逻辑思维,这块是很难搞明白的,前面2次总结中已经为大家分享过有关技术的一些基 ...

  9. Android 多线程下载文件原理霸气解析介绍 -----文件的下载(3)

    1.首先我们先创建好下载的位置–根据url创建文件. /*** <p>Title: FlieStorageManager</p >* <p>Description: ...

  10. Android 多线程下载以及断点续传

    多线程下载 在日常开发中,我们不可避免的会接到类似这样的需求,下载一个比较大的素材文件或者安装包文件,以此实现APP的自动更新,APP内的素材替换等.由于一般此类文件都比较大,一般会在50M以上,如果 ...

最新文章

  1. 191127注意事项
  2. 【转】EXC_BAD_ACCESS问题在xode4下的调试技巧
  3. 过程工程中的计算机应用基础,CDIO工程教育培养模式在《计算机应用基础》课中的应用...
  4. 施一公:中国还缺乏真正的世界顶尖大学,研究生该听听这些建议
  5. 特定热点事件监控与分析项目
  6. python爬虫爬取雪球网_Python爬虫爬取天天基金网基金排行
  7. Oracle mysql 语句_Oracle 数据库常用操作语句大全
  8. cenyos7安装 yum不可用_centos7安装fabric
  9. 数据库 Oracle监听实例详解
  10. MULTISIM下载安装
  11. Java 方法重载和覆盖重写的区别及注意事项
  12. 在Word中如何设置分级标题?
  13. Mac --显示隐藏文件
  14. ubuntu切换python版本解决语法不匹配问题(SyntaxError: invalid syntax)
  15. [VS报错] 应用程序无法正常启动0xc000007b -- 解决措施
  16. 《Erlang程序设计》第十六章 OTP概述
  17. 大学计算机社团学什么好,大学一般有哪些社团 最值得报名的社团有哪些
  18. python抓取微博评论的图片_用Python语言爬虫抓取微博评论图文教程
  19. Tablespace for table ‘`xxx`.`xxx`‘ exists. Please DISCARD the tablespace
  20. 智能电销机器人对企业的营销助力

热门文章

  1. 关于mybatis中的大于号和小于号的错误
  2. 使用CAD偏移和阵列命令绘制图形、使用CAD旋转复制命令绘制图形
  3. html生成闪电特效
  4. 祝福老婆今晚不要太生气
  5. 响应式布局——视口viewport和常用单位
  6. 分布式算法-Paxos
  7. python课件 gitbook_gitbook使用教程
  8. pep8 python 编码规范下载_PEP8 Python 编码规范整理
  9. ArcGIS栅格按照象元大小生成矢量的方法
  10. 请每一个恋爱中的人耐心地看下去