Android 断点续传下载-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

Android 断点续传下载

简介:

断点续传下载,其实就是记录下原来下载的位置,然后从那个位置开始下载就是了。

代码如下。

/**
	 * 作用:断点续传下载<BR>
	 * 作者:peijiangping<BR>
	 * 日期:2011-6-11
	 */
	public static int doDownloadTheFile_test(String strPath, String filePath,
			String filename, int mode, long size, Handler handler) {
		//file.size()即可得到原来下载文件的大小
		//下载路径
		String url = strPath;
		// 设置代理
		Header header = null;
		if (mode == 2) {
			//移动内网的时候使用代理
			url = format_CMWAP_URL(strPath);
			header = new BasicHeader("X-Online-Host",
					format_CMWAP_ServerName(strPath));
		}
		HttpResponse response = null;
		// 用来获取下载文件的大小
		HttpResponse response_test = null;
		try {
			HttpClient client = new DefaultHttpClient();
			HttpClient client_test = new DefaultHttpClient();
			HttpGet request = new HttpGet(url);
			HttpGet request_test = new HttpGet(url);
			if (header != null) {
				request.addHeader(header);
			}
			response_test = client_test.execute(request_test);
			//获取需要下载文件的大小
			long fileSize = response_test.getEntity().getContentLength();
			// 验证下载文件的完整性
			if (fileSize != 0 && fileSize == size) {
				return 1;
			}
			//设置下载的数据位置XX字节到XX字节
			Header header_size = new BasicHeader("Range", "bytes=" + size + "-"
					+ fileSize);
			request.addHeader(header_size);
			response = client.execute(request);
			InputStream is = response.getEntity().getContent();
			if (is == null) {
				throw new RuntimeException("stream is null");
			}
			SDCardUtil.createFolder(filePath);
			//获取文件对象,开始往文件里面写内容
			File myTempFile = new File(filePath + "/" + filename);
			RandomAccessFile fos = new RandomAccessFile(myTempFile, "rw");
			//从文件的size以后的位置开始写入,其实也不用,直接往后写就可以。有时候多线程下载需要用
			fos.seek(size);
			byte buf[] = new byte[1024];
			long downloadfilesize = 0;
			do {
				int numread = is.read(buf);
				if (numread <= 0) {
					break;
				}
				fos.write(buf, 0, numread);
				if (handler != null) {
					Message msg = new Message();
					downloadfilesize += numread;
					double percent = (double) (downloadfilesize + size)
							/ fileSize;
					msg.obj = String.valueOf(percent);
					handler.sendMessage(msg);// 更新下载进度百分比
				}
			} while (true);
			is.close();
		} catch (Exception ex) {
			ex.printStackTrace();
			return -1;
		}
		return 1;
	}


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章