一、概述
应用程序开启了一个后台线程进行文件下载,如果文件过大(或者网络质量不佳)时可以实现断点续传,通过判断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
本文介绍了使用线程进行文件下载,并实现Http协议的断点续传功能。通过线程机制,启动和终止下载任务,并在Activity的onDestroy()中优雅地退出线程。此外,详细解析了Http协议的Range头域在断点续传中的作用,以及如何设置Http头请求特定的文件范围。
571

被折叠的 条评论
为什么被折叠?



