android系统的下载代码写的很好,考虑的比较全面,值得我们学习。
DownloadThread是其中执行下载的部分,下面从run进行研究。

run(){

    一上来会设置一下下载线程的优先级:THREAD_PRIORITY_BACKGROUND

    创建下载使用的AndroidHttpClient;

    创建PowerManager.WakeLock,具体做什么用的不太清楚;

try {
while(!finished) {
设置代理;
创建HttpGet对象;
调用 executeDownload(),执行下载;
关闭HttpGet;
}
  
设置下载目标文件的一些状态; 释放各个资源:Client、wakeLock; 通知下载完成;
}
catch(StopRequestException) {
退出
}
catch(Throwable) {
报错
}
}
executeDownload(){ setupDestinationFile():检查目标文件的状态,也就是要下载下来的文件在本地的状态; addRequestHeaders():添加一些http请求头; checkConnectivity():检查网络连接性; sendRequest():发出请求; handleExceptionalStatus():处理http code; processResponseHeaders():读取http返回头,做出对应处理,包括创建目标文件以及更新数据库等; openResponseEntity():打开http输入流; transferData():接收数据; }
setupDestinationFile(){ 若之前没有进行过下载(mFilename == null) { 检查文件名是否合法; 若目标文件已经存在: {
若文件长度为0,则删除文件;
若etag无效且文件是完整的,则删除文件;
其他情况,则认为可以续传: {
使用此文件打开OutputStream;
读取已下载大小;
设置总大小;
设置ETag;
}
}
} 最后会关闭刚刚打开的OutputStream,好怪。。。 }
addRequestHeaders(){ 添加之前设置的Http header,有可能是Cookie之类的;
若是续传: { 添加If-Match头,即ETag;
添加Range头:currentBytes - ; } }
checkConnectivity(){ 根据当前网络连接性与网络设置进行一些判断; }
sendRequest(){ 就是调用了client.execute() }
handleExceptionalStatus(){ 根据http code做不同处理: { 503:
设置retryAfter变量后退出下载线程,有可能在外面进行重试吧; 301,302,303,307:
记录新的url,然后重新进行http连接; 若期待的http code(200或206)与返回的不符,则:
416: 直接报错;
其他错误码:进行不同报错; } }
processResponseHeaders(){ readResponseHeaders(): {
读取各个http header并且保存其中信息:
Content-Disposition
Content-Location
Content-Type
ETag
Transfer-Encoding
Content-Length
} DRM转换相关工作; 生成保存的文件名; 更新一下数据库; 再次检查一下网络连接; }
openResponseEntity(){ 就是直接调用getEntity().getContent(); } transferData(){ for(;;) { 读取输入流; 若返回-1,则判断是否下载完成;
否则,将数据写到目标文件中: {
首先检查空间是否够用;
然后根据DRM的设置使用不同的方式将数据写入文件;
最后关闭文件;
} 更新状态,数据库,进行通知; 判断是否要暂停,以及是否要根据网络状态暂停;
} }

Android DownloadThread.run()学习的更多相关文章

  1. Android之SurfaceView学习(一)转转

    Android之SurfaceView学习(一) 首先我们先来看下官方API对SurfaceView的介绍 SurfaceView的API介绍 Provides a dedicated drawing ...

  2. android NDK 实用学习(五)-c++端调用java接口

    1,阅读此文章前请阅读前面文章,以免阅读出现障碍: android NDK 实用学习(一)-获取java端类及其类变量 android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值 ...

  3. android NDK 实用学习(三)- java端类对象的构造及使用

    1,读此文章前我假设你已经读过: android NDK 实用学习-获取java端类及其类变量 android NDK 实用学习-java端对象成员赋值和获取对象成员值 2,java端类对象的构造: ...

  4. android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值

    1,关于java端类及接口定义请参考: android NDK 实用学习-获取java端类及其类变量 2,对传过来的参数进行赋值: 对bool类型成员进行赋值  env->SetBooleanF ...

  5. Android源码学习之装饰模式应用

    首先得了解最基础的装饰器模式 参考 设计模式之八 --- 装饰模式(Decorator) 参考链接:http://blog.csdn.net/cjjky/article/details/7478788 ...

  6. Android应用开发学习之表格视图

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 本文我们来学习一个使用表格视图的程序,下图是该程序的运行效果: 该程序主Activity文件内容如下: packag ...

  7. 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)

    原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据 ...

  8. Android] Android XML解析学习——方式比较

     [Android] Android XML解析学习——方式比较 (ZT)  分类: 嵌入式 (From:http://blog.csdn.net/ichliebephone/article/deta ...

  9. Android开发该学习哪些东西?

    开篇: 本人也是众多Android开发道路上行走的一员,听了不少大神的知乎live,自己也看了不少书,也和不少前辈交流过,所以在这里分享一下Android开发应该学习的书籍以及知识,当然,也包括一些方 ...

随机推荐

  1. 华为在线OJ_找7

    描述 输出7有关数字的个数,包括7的倍数,还有包含7的数字(如17,27,37...70,71,72,73...)的个数 知识点 循环 运行时间限制 0M 内存限制 0 输入 一个正整数N.(N不大于 ...

  2. 合理配置MySQL缓存 提高缓存命中率

    众所周知,系统读取数据时,从内存中读取要比从硬盘上速度要快好几百倍.故现在绝大部分应用系统,都会最大程度的使用缓存(内存中的一个存储区域),来提高系统的运行效率.MySQL数据库也不例外.在这里,笔者 ...

  3. ###《Effective STL》--Chapter7

    点击查看Evernote原文. #@author: gr #@date: 2014-08-31 #@email: forgerui@gmail.com Chapter7 在程序中使用STL Topic ...

  4. MarkDown中锚点的使用

    在文档中创建锚点: <A NAME="ROP_ON_ARM">Davi L, Dmitrienko A, Sadeghi A R, et al. [Return-ori ...

  5. ios7之后 根据UILabel的文字计算frame的方法

    ios7 新出来的根据label的文字和字体大小来确定label的宽高. 官方的方法是: - (CGRect)boundingRectWithSize:(CGSize)size options:(NS ...

  6. JavaScript学习笔记(6)——JavaScript语法之对象

    JavaScript 中的所有事物都是对象:字符串.数字.数组.日期,等等. 在 JavaScript 中,对象是拥有属性和方法的数据. 属性是与对象相关的值. 方法是能够在对象上执行的动作. 提示: ...

  7. dubbo监控活跃线程数

    telnet对应dubbo服务的ip+端口号 status -l 其中的active就是当前的活跃线程数 通过程序定时探测写入DB,再查询渲染出来就好了 监控报警,如果已经有监控平台,可以通过一定的规 ...

  8. 392. Is Subsequence

    392. Is Subsequence 水题,先是判断长度,长度t比s小,返回false,然后从左到右扫描t,然后同时扫描s,如果相同,s的index就往后拉一个,如果s的index等于s长度,返回t ...

  9. bzoj 1096: [ZJOI2007]仓库建设

    dp是很好想的了,关键是数据太大,普通dp肯定超时,所以一定有用某种优化,dp优化也就那么几种,这道题用的是斜率优化,先写出普通的状态转移方程: dp[i] = min{  dp[j] + Σ ( p ...

  10. 建造者模式(Builder Pattern)

    建造者模式:使用多个简单对象一步步构建成一个复杂的对象. 有时候,我们会创建一个“复杂”的对象,这个对象的由很多子对象构成,由于需求的变化,这个对象的各个部分经常面临剧烈的变化. 继续工厂模式的披萨店 ...