Android开发--多线程下载加断点续传

本文介绍了Android应用中实现多线程下载和断点续传的详细步骤,包括通过Http协议的Range字段分段下载,使用RandomAccessFile进行文件随机访问,以及利用Handler传递下载进度。同时,文章提到了使用DownloadInfo类保存下载状态,并通过数据库进行信息持久化,以支持断点续传功能。作者还分享了项目的百度云盘下载链接,供读者参考。
摘要由CSDN通过智能技术生成

        文件下载在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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值