DownloaderTest | Http协议 | 断点续传 | Thread

本文介绍了使用线程进行文件下载,并实现Http协议的断点续传功能。通过线程机制,启动和终止下载任务,并在Activity的onDestroy()中优雅地退出线程。此外,详细解析了Http协议的Range头域在断点续传中的作用,以及如何设置Http头请求特定的文件范围。

一、概述

      应用程序开启了一个后台线程进行文件下载,如果文件过大(或者网络质量不佳)时可以实现断点续传,通过判断MD5码来校验是否分步下载时是否下载的同一个文件。

[效果图]

 

 

二、线程机制Thread

线程启动时,CPU将轮流给每个任务分配其占用时间 ,每个线程任务都觉得自己是独占了CPU,但事实上是CPU时间划分成片断分配给了所有任务。

1.线程驱动任务

你需要一种描述任务的方式,这由Runnable接口提供。定义任务,要实现Runnable接口并重写run()方法

 

2.开始线程

Thread构造器需要一个Runnable对象,调用Thread的Start()为该线程执行必要的初始化操作,然后调用Runnable的run方法,就能启动任务。

 

3.终止线程

忘掉Thread.stop方法。 虽然它确实停止了一个正在运行的线程,然而这种方法是不安全。

Thread.stop方法恰恰相 反的是Thread.interrupt 方法,它提供了机会给线程作清理工作 ,很Gentleman :) 。

Thread.join 指在一线程里面调用另一线程join方法时,表示将本线程阻塞直至另一线程终止时再执行

超链接

在startDownloadThre ad函数中分配线程任务,并启动线程。在Activity的onDestroy()函数中,先调用Thread.interrupt 方法“绅士地”退出线程 (实际上,执行该语句后,线程有时还继续运行。),所以,用Thread.join来控制本线程执行终止后再执行调用线程

 

4.线程调度

首先,线程的调度机制是非确定性 的,而可以肯定的是调度其倾向于给优先权 高的线程分配CPU (优先执行),然而这也不意为着优先权较低的线程得不到执行(也就说,优先权不会导致死锁 。)

三、Http协议/断点续传

Http协议是一种“请求-响应”的方式进行工作的。

典型的请求消息如下:

GET http://download.microtool.de:80/somedata.exe
Host: download.microtool.de
Accept:*/*
Pragma: no-cache
Cache-Control: no-cache
Referer: http://download.microtool.de/
User-Agent:Mozilla/4.04[en](Win95;I;Nav)
Range:bytes=554554-


(注意:最后一行为空行,标志请求结束)


上例第一行表示HTTP客户端(可能是浏览器、下载程序)通过GET方法获得指定URL下的文件。
Host头域
Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。
Referer头域
Referer 头域允许客户端指定请求uri的源资源地址,这可以允许服务器生成回退链表,可用来登陆、优化cache等。他也允许废除的或错误的连接由于维护的目的被 追踪。如果请求的uri没有自己的uri地址,Referer不能被发送。如果指定的是部分uri地址,则此地址应该是一个相对地址。
Range头域
Range头域可以请求实体的一个或者多个子范围 (用于断点续传) 。例如,
表示头500个字节:bytes=0-499
表示第二个500字节:bytes=500-999
表示最后500个字节:bytes=-500
表示500字节以后的范围:bytes=500-
第一个和最后一个字节:bytes=0-0,-1
同时指定几个范围:bytes=500-600,601-999
但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200 (OK)。

User-Agent头域
User-Agent头域的内容包含发出请求的用户信息。

在Http1.1版本的协议中,请求方法包括(GEG、HEAD、POST等)。下载一般采用GET方法。在Android中可生成一个HttpGet类的示例进行Get操作请求和响应。

 

另外,请求的http头中还可以设置是连接类型 是否为长连接,Keep-Activity.

 

以下代码创建了一个HttpGet的实例,通过addHeader设置Http头,设置为从指定偏移位置(startOffset)开始下载。想不通为什么客户端获得回应的内容后要执行这句is.skip(bytesToSkip);???

 

 

[参考]

Chunked编码

http://www.21andy.com/blog/20071109/660.html

HTTP 1.1协议和断点续传

http://blog.sina.com.cn/s/blog_62d3985f0100n2iu.html

浅谈Http协议

http://zhkl0228.itpub.net/post/16467/127848

Http头信息详解

http://kofj.net/html/view-2010-12/http-%E5%A4%B4%E4%BF%A1%E6%81%AF%E8%AF%A6%E8%A7%A3.html

Http断点传输

http://blog.csdn.net/sendy888/archive/2007/07/31/1719105.aspx

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值