• 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的设置使用不同的方式将数据写入文件; 最后关闭文件; } 更新状态,数据库,进行通知; 判断是否要暂停,以及是否要根据网络状态暂停; } }
  • 相关阅读:
    ASP.NET MVC路由模块
    线程安全的单例模式
    MVC自带表单效验
    MSsql 中 in 语法排序的说明
    Web.Config配置错误页面处理
    WCF基本应用
    .NET微信自定义分享标题、缩略图、超链接及描述的设置方法
    .NET微信通过授权获取用户的基本信息
    C#中获取服务器IP,客户端IP以及网卡物理地址
    .NET获取客户端、服务器端的信息
  • 原文地址:https://www.cnblogs.com/alexcai/p/3436232.html
Copyright © 2020-2023  润新知