ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 低调看直播体育app软件下载 >> 移动开发 >> android开发笔记之多线程下载及断点续传

android开发笔记之多线程下载及断点续传(1/3)

来源:网络整理     时间:2016-06-03     关键词:

本篇文章主要介绍了"android开发笔记之多线程下载及断点续传",主要涉及到方面的内容,对于移动开发感兴趣的同学可以参考一下: 今天我们来接触一下多线程下载,当然也包括断点续传,我们可以看到 很多下载器,当开通会员的时候下载东西的速度就变得快了许多,这是为什么呢?这就是跟今天讲的多线程...

今天我们来接触一下多线程下载,当然也包括断点续传,我们可以看到
很多下载器,当开通会员的时候下载东西的速度就变得快了许多,这是为什么呢?这就是跟今天讲的多线程有关系了,其实就是多开了几个线程一起下载罢了。当然真正的多线程下载要比这个复杂,要考虑很多问题。

做个不恰当的比喻:

假如我们把一个服务器上的文件看作是一个水缸里的水的话,那么多线程下载就相当于从水缸上打了多个小孔,然后塞进去小管道进行抽水。呵呵,也许这个比喻不够准确。

效果:

android开发笔记之多线程下载及断点续传

这里下载的是本地服务器上的文件,你们可以下载网络上的一些文件。

先来看看多线程下载的原理吧:

通常服务器同时与多个用户连接,用户之间共享带宽。如果N个用户的优先级都相同,那么每个用户连接到该服务器上的实际带宽就是服务器带宽的N分之一。可以想象,如果用户数目较多,则每个用户只能占有可怜的一点带宽,下载将会是个漫长的过程。

android开发笔记之多线程下载及断点续传

假设服务器的带宽为20M/s,服务器上有很多电影资源,现在有三位同学都想要下载 小泽.avi 这部电影,现在三位同学都在下载,所以每位同学的速度应该为1/3 * 20M/s = 6.7M/s ,但是 小泽.avi 这部电影的大小有 2G左右,这时王五同学可能有点赶时间,等不及,下的这么慢,所以他就使用他所学的多线程的知识多开了几个线程,结果他最先下完。

android开发笔记之多线程下载及断点续传

这次可以看到分给每个线程的带宽为1/5 * 20M/s = 4M/s,但是后面三个线程都是王五同学的,这时王五同学的带宽其实为 12M/s ,没错,王五同学成功运用多线程知识解决了下载慢的问题。(神不知鬼不觉)

看到这里我们可以知道,影响用户带宽的因素:

①服务器的带宽

②线程数

不过笔者认为凡事适可而止,不要做得太绝了。这样让别的用户怎么办呢(不管?不太好吧!)?

好的,那让我们来看下具体如何实现:

要实现这个,需要解决以下几个问题:

问题1:怎么在一个文件里面写数据的时候按照指定的位置写(因为每个线程的下载区间需要不一样,不然数据会覆盖,导致文件下不全)

问题2:如何去获取要下载的文件大小(因为怕下载中途需要下载其他东西,导致本次需要下载的文件内存不足,所以需要先预留一个和要下载的文件大小一样大的空间)

问题3:计算每个子线程的下载区间(因为每个线程的下载区间肯定不一样,不然怎么加快速度呢)

第一个问题的解决办法:

借助RandomAccessFile 随机文件访问类的 seek(long offset)方法,这个方法可以把文件的写入位置移动至offset。

第二个问题的解决办法:

我们可以使用HttpURLConnection 对象的 getContentLength() 方法得到你当前请求文件的大小。

第三个问题的解决办法:

android开发笔记之多线程下载及断点续传

假设下载的文件大小为10B(0-9,数组下标从0开始),线程数为3,那么

线程0的下载区间应该是: 0—2

线程1的下载区间应该是: 3—5

线程2的下载区间应该是: 6—9

每个线程下载文件的大小 = 文件长度 / 线程数 (最后一个线程除外,因为可能不能均分)

相关图片

相关文章