android多线程下载

本文参考自:http://blog.csdn.net/jdsjlzx/article/details/8617485


在项目中学习到安卓一个基本的多线程下载实现,本文总结一下实现步骤以及基本的原理。

一、应当创建一个继承线程(Thread)的多线程下载类,在这个类内部管理关于下载的数据(更新UI,计算网速,计算已下载量与剩余时间等)。以下讲一下重写的run()方法大概流程:

1.声明多个下载线程(真正执行下载的线程,需要自己实现,后面会讲)。注意只是声明,并未分配内存;


2.创建一个urlConnection,这时创建的urlConnection并不执行下载,而是获取关于这次下载文件的信息(大小长度,名字等);


3.为这次下载文件在本地创建储存内存。主要用到File类(File file = new File(path+"/"+name)),注意path的正确性。因为未root的安卓管理权限问题,并不是所有路径都能用来存储的。可以选择(/data/data/com.xxx.xxx(你的包名)),此时下载到的文件将存放在该应用的目录下,并不为其他应用所见,所以你用文件管理系统都找不到的。或者选择存放到(/sdcard/xxx)上,这种方法下载的文件可以通过文件管理可以看到。但要注意一点就是xxx文件夹不存在的话,需要在代码里先创建(File.mkdir(),File.createNewFile());


4.修改该新建的文件,主要是设置文件的size,需要与将要下载的文件大小一样,不然可能会解析出错。主要用到RandomAccessFile类(RandomAccessFile.setLength(),设置完毕后需要关闭RandomAccessFile.close());


5.在为之前的下载线程声明分配分配之前,需要确定每一个线程该下载的量以及下载比特流的初始位置和结束位置。多线程的的核心就是将一个文件以比特流的形式分成几部分,每一个部分分给一个线程去下载。通过对url头部(http头部信息“Range='初始位置'-‘结束位置’”)的设置,可以规定该urlConnection只下载此次连接固定的比特流段;


6.确定每一个线程的下载量以及下载起始和结束之后,逐一为声明分配内存,并启动下载。


二、实现执行下载的类:

1.从构造方法里面得到关于这次下载的信息(url,保存文件,起始位置,结束位置);


以下是run()方法:

2.为了从下载的缓存里面把比特流转移到文件上,需要BufferedInputStream对象,以及byte[] buffer空间;


3.连接url,url.openConnect(),并设置property,conn.setRequestConnect()   //设置Range;


4.获得该文件的读写权限,同样是RandomAccessFile对象,通过RandomAccessFile.seek(),把文件的读写游标定位到下载的初始位置;


5.将BufferedInputStream输入流绑定到url的下载流上(conn.getInputStream());


6.循环,将下载流转移到缓存 byte[] (BufferedInputStream.read()),再把缓存往文件上搬(RandomAccessFile.write),直到该下载段完成。


三、在两个类的实现中,都应该适当地计算一些数据(下载时间,下载百分比,下载量等),并做好接口供自己去调用。


你可能感兴趣的:(多线程,android)