Android DownloadThread.run()学习
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()学习的更多相关文章
- Android之SurfaceView学习(一)转转
Android之SurfaceView学习(一) 首先我们先来看下官方API对SurfaceView的介绍 SurfaceView的API介绍 Provides a dedicated drawing ...
- android NDK 实用学习(五)-c++端调用java接口
1,阅读此文章前请阅读前面文章,以免阅读出现障碍: android NDK 实用学习(一)-获取java端类及其类变量 android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值 ...
- android NDK 实用学习(三)- java端类对象的构造及使用
1,读此文章前我假设你已经读过: android NDK 实用学习-获取java端类及其类变量 android NDK 实用学习-java端对象成员赋值和获取对象成员值 2,java端类对象的构造: ...
- android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值
1,关于java端类及接口定义请参考: android NDK 实用学习-获取java端类及其类变量 2,对传过来的参数进行赋值: 对bool类型成员进行赋值 env->SetBooleanF ...
- Android源码学习之装饰模式应用
首先得了解最基础的装饰器模式 参考 设计模式之八 --- 装饰模式(Decorator) 参考链接:http://blog.csdn.net/cjjky/article/details/7478788 ...
- Android应用开发学习之表格视图
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 本文我们来学习一个使用表格视图的程序,下图是该程序的运行效果: 该程序主Activity文件内容如下: packag ...
- 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)
原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据 ...
- Android] Android XML解析学习——方式比较
[Android] Android XML解析学习——方式比较 (ZT) 分类: 嵌入式 (From:http://blog.csdn.net/ichliebephone/article/deta ...
- Android开发该学习哪些东西?
开篇: 本人也是众多Android开发道路上行走的一员,听了不少大神的知乎live,自己也看了不少书,也和不少前辈交流过,所以在这里分享一下Android开发应该学习的书籍以及知识,当然,也包括一些方 ...
随机推荐
- HTML <input> 标签的 type 属性
HTML <input> 标签的 type 属性 HTML <input> 标签 实例 下面的表单拥有两个输入字段以及一个提交按钮: <form action=" ...
- Ext.Net学习笔记21:Ext.Net FormPanel 字段验证(validation)
Ext.Net学习笔记21:Ext.Net FormPanel 字段验证(validation) 作为表单,字段验证当然是不能少的,今天我们来一起看看Ext.Net FormPanel的字段验证功能. ...
- 【制作镜像Win*】系统安装
图形化安装系统,在询问“进行何种类型的安装?”时,选择“自定义(高级)” 下一步看不到硬盘,如图: 选择“加载驱动程序”,安装驱动. 将相应版本的netkvm.inf和viostor.inf装上. 继 ...
- springmvc(五)----异常处理
总结
- [翻译][MVC 5 + EF 6] 12[完结]:高级场景
原文:Advanced Entity Framework 6 Scenarios for an MVC 5 Web Application 1.执行原生SQL查询: EF Code First API ...
- SharePoint工作流(workflow)不能自动启动
在定制工作流时,设置了当Item创建或更改时,触发工作流.用系统帐户登录时一直不会触发.这是因为这是SharePoint的安全机制,阻止了在系统帐户登陆时自动启动工作流. 解决方法:使用不是系统账户的 ...
- 【转载】C#后台声明式验证,远离if验证
ViewModel public class ViewModel { [Required(ErrorMessage="标题不能为空")] public string Title { ...
- PHP中使用curlL实现GET和POST请求的方法
基本结构 (1)初始化 curl_init() (2)设置变量 curl_setopt() .最为重要,一切玄妙均在此.有一长串cURL参数可供设置,它们能指定URL请求的各个细节.要一次性全部看完并 ...
- A Case for Flash Memory SSD in Enterprise Database Applications
通过分析固态硬盘的特性对数据库中不同对象,如:表,索引,回滚段,重做日志等的应用进行具体研究,最后将数据库中不同的对象进行区别应用
- 支付宝api教程,支付宝根据交易号自动充值
最近公司要用php做一个网站支付宝自动充值的功能,具体就是客户把钱直接转到公司的支付宝账号里,然后在我们网站上填写上交易号,我们网站程序自动获取交易信息,自动给网站的账户充值. 我的具体想法就是利用支 ...