文件下载在App应用中也用到很多,一般版本更新时多要用的文件下载来进行处理,以前也有看过很多大神有过该方面的博客,今天我也自己来实践一下,写的一般,还请大家多提意见,共同进步。主要思路:
1.多线程下载:
首先通过下载总线程数来划分文件的下载区域:利用int range = fileSize / threadCount;得到每一段下载量;每一段的位置是i * range到(i + 1) * rang - 1,注意最后一段的位置是到filesize - 1;
通过Http协议的Range字段实现下载文件的分段;
通过Java类RandomAccessFile可以实现文件的随机访问,利用seek方法定位的文件的指定位置;
由HttpUrlConnection获取流来进行流的读写,实现文件的存储;
在下载过程中利用Handler来向外传递下载的信息。
2.断点续传:
对于每一个线程利用一个DownloadInfo类来保存下载的信息,每次在下载过程中向数据库更新信息(我也有想过只在下载暂停时进行更新,但那样的话我们的进程被杀掉时信息就无法保存下来)。在进行下载之前去访问数据库是否有记录存在,如果没有执行第一次下载的初始化,如果存在记录但下载文件不存在时,删掉数据库中的记录之后进行第一次下载的初始化,如果有记录且文件存在,则从数据库中取出信息。
实现的效果如图,自己封装的类提供了开始,暂停,删除,以及重新下载的方法。还没来得及将工程穿上CSDN,给大家一个百度云盘的下载地址:http://pan.baidu.com/s/1dD1Xo8T
主要类的结构有:
1)DownloadHttpTool:利用Http协议进行网络下载类
2)DownlaodSqlTool, DownLoadHelper:数据库相关操作类
3)DownloadInfo:下载信息保存类
4)DownloadUtil:封装下载方法并提供对外接口的类
贴一下代码:DownloadInfo类
package com.example.test;
public class DownloadInfo {
/**
* 保存每个下载线程下载信息类
*
*/
private int threadId;// 下载器id
private int startPos;// 开始点
private int endPos;// 结束点
private int compeleteSize;// 完成度
private String url;// 下载文件的URL地址
public DownloadInfo(int threadId, int startPos, int endPos,
int compeleteSize, String url) {
this.threadId = threadId;
this.startPos = startPos;
this.endPos = endPos;
this.compeleteSize = compeleteSize;
this.url = url;
}
public DownloadInfo() {
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getThreadId() {
return threadId;
}
public void setThreadId(int threadId) {
this.threadId = threadId;
}
public int getStartPos() {
return startPos;
}
public void setStartPos(int startPos) {
this.startPos = startPos;
}
public int getEndPos() {
return endPos;
}
public void setEndPos(int endPos) {
this.endPos = endPos;
}
public int getCompeleteSize() {
return compeleteSize;
}
public void setCompeleteSize(int compeleteSize) {
this.compeleteSize = compeleteSize;
}
@Override
public String toString() {
return "DownloadInfo [threadId=" + threadId + ", startPos=" + startPos
+ ", endPos=" + endPos + ", compeleteSize=" + compeleteSize
+ "]";
}
}
DownLoadHelper类,创建我们的数据库文件
package com.example.test;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* 利用数据库来记录下载信息
* @author acer
*/
public class DownLoadHelper extends SQLiteOpenHelper{
private static final String SQL_NAME = "download.db";
private static final int DOWNLOAD_VERSION=1