网络下载类WebDownload封装了对请求的瓦片进行网络下载的相关操作。该类使用了两个委托类型和一个枚举类型。 该类的类图如下。

网络下载类WebDownload各个字段和属性的含义说明如下:

static public bool Log404Errors = false;//网络下载错误类型

static public bool useWindowsDefaultProxy = true;//是否使用Windows默认代理

static public string proxyUrl = "";//代理的URL字符串,默认为空

static public bool useDynamicProxy;// 是否使用动态代理

static public string proxyUserName = "";//代理用户名,默认为空

static public string proxyPassword = "";//代理密码,默认为空

public static string UserAgent//用户代理

public string Url;//统一资源定位符

public Stream ContentStream;//内存下载填充的数据内容流

public string SavedFilePath;//保存路径

public bool IsComplete;//是否下载完成

public DownloadProgressHandler ProgressCallback;//当数据正在被接收时调用。注意:如果服务器没有回复内容长度,总的字节数将为零

public static DownloadCompleteHandler DebugCallback;//被调用来更新debug窗口

public static DownloadCompleteHandler DownloadEnded; //当一个下载结束于成功或失败时被调用

public DownloadCompleteHandler CompleteCallback; //当一个下载完成时被调用。调用核实(查证)函数,以从事件处理函数里抛出任何异常

public DownloadType DownloadType = DownloadType.Unspecified;//下载类型

public string ContentType; //数据内容类型:浮点型或16位整形

public int BytesProcessed; //被处理的字节数

public int ContentLength; //数据内容长度

public bool Compressed = false;//是否被压缩,允许地点查找器使用gzipped压缩请求,默认为不压缩的请求,以免终端其它事情

public string ContentEncoding; //数据内容编码

public DateTime DownloadStartTime = DateTime.MinValue; //下载开始时间,如果还没有开始下载则设置为DateTime.MinValue

internal HttpWebRequest request; //Http网络请求

internal HttpWebResponse response; //Http网络响应

protected Exception downloadException;//下载异常

protected bool isMemoryDownload;//是否是内存下载

private bool stopFlag = false;//是否停止下载的标识,作为下载线程终止的标识

protected Thread dlThread;//下载线程

public bool IsDownloadInProgress//下载是否正在进行中的标识,通过判断下载线程对象是否为空以及是否处于活动状态来判断

public Exception Exception//下载异常字段的只读属性

构造函数都比较简单,不再赘述。

方法public void BackgroundDownloadFile()发起后台下载文件的线程,异步地下载请求数据到文件。被另外两种重载类型调用。重载一先注册下载完成事件委托实例CompleteCallback的处理函数,然后再调用原型函数发起后台异步下载数据的线程。重载二先设置下载完类型,然后再调用原型函数发起后台异步下载数据的线程,用来下载特定类型的影像数据,需要为WMS请求处理服务错误

方法public void BackgroundDownloadMemory()发起后台内存下载文件的线程,异步地下载请求数据到内存缓冲区。被另外两种重载类型调用。重载一先注册下载完成事件委托实例CompleteCallback的处理函数,然后再调用原型函数发起后台异步下载数据的线程。重载二先设置下载完类型,然后再调用原型函数发起后台异步下载数据的线程,用来下载特定类型的影像数据,需要为WMS请求处理服务错误

方法public void DownloadFile( string destinationFile ) 同步地下载请求数据到文件,其内部调用Download()函数真正完成同步数据下载。被另外一种重载类型调用。其重载先设置下载类型,然后再调用原型函数下载数据

方法public void DownloadMemory( DownloadType dlType ) 同步地下载请求数据到内存缓冲区。被另外两种重载类型调用。重载一先设置下载类型,然后再调用原型函数同步下载数据。重载二先注册下载处理中事件委托实例progressCallback的处理函数,然后再调用原型函数同步下载数据

方法public void Cancel()终止当前的下载

方法public void SaveMemoryDownloadToFile(string destinationFilePath )保存Http内存下载数据到文件中

方法private void OnProgressCallback(int bytesRead, int totalBytes)表示正在下载中的回调函数,内部调用委托ProgressCallback注册的处理函数。该方法被Download()函数三次调用

方法private static void OnDebugCallback(WebDownload wd)当需要下载细节信息是被调用,内部调用委托DebugCallback注册的处理函数。该方法被Download()函数三次调用,被Dispose()函数调用一次

方法private static void OnDownloadEnded(WebDownload wd)当下载已经结束时被调用,内部调用委托DownloadEnded注册的处理函数。该方法被Download()函数一次调用

方法protected void Download()同步进行HTTP下载,被前文提到的异步文件下载BackgroundDownloadFile,异步内存下载BackgroundDownloadMemory,同步文件下载DownloadFile,同步内存下载DownloadMemory四个函数四次调用。该方法的概略执行步骤为:先调用OnProgressCallback和OnDebugCallback去通知注册的委托做相应的处理,再通过isMemoryDownload变量判断是内存下载还是文件下载,从而为流变量ContentStream申请内存流或文件流空间。然后创建网络请求对象,并为请求对象指定用户代理、代理内容。然后利用网络请求对象依次获取请求响应和请求响应流,并将请求响应流中的内容提取出来(以1500字节为单位逐次提取)再写入到前面申请的流对象ContentStream的空间中去,接着调用OnProgressCallback和OnDebugCallback去通知注册的委托做相应的处理。最后调用OnDownloadEnded(this)方法转到注册的委托实例函数去做相关的处理。

方法private void HandleErrors()处理未被网络请求自身捕捉的异常

方法public void Verify()当出现异常时,通过调用该函数将会被抛出

方法private void SaveException( Exception exception )把下载错误异常信息写入日志文件

方法private void SetMapServerError()读取来子服务器的XML错误,抛出具有该信息的错误

方法public void Dispose()执行释放、清理或重置应用程序执行任务所定义的非托管资源

WorldWind源码剖析系列:网络下载类WebDownload的更多相关文章

  1. WorldWind源码剖析系列:设置类SettingsBase

    PluginSDK中的星球设置类WorldSettings 和WorldWind.程序设置类WorldWindSettings均继承自父类SettingsBase.类图如下所示.其中父类Setting ...

  2. WorldWind源码剖析系列:下载请求类DownloadRequest

    下载请求类DownloadRequest是各种下载请求的抽象基类,先派生出网络下载请求类WebDownloadRequest,再派生出地理空间下载请求类GeoSpatialDownloadReques ...

  3. WorldWind源码剖析系列:挂件类Widgets

    WorldWindow用户定制控件类中所包含的的挂件类Widgets控件主要有如下图所示的派生类.它们的类图如下所示. 鉴于挂件类Widgets及其派生类,相对简单,基本上都是些利用DirectX3D ...

  4. WorldWind源码剖析系列:缓冲类Cache

    缓冲类Cache主要用于在最小的限制条件下保存从远程服务器通过网络下载下来的地理空间数据,以便当用户处于离线状态时能够使用这些已经缓冲好的数据.Google Earth也采用类似机制处理用户离线浏览漫 ...

  5. WorldWind源码剖析系列:下载队列类DownloadQueue

    下载队列类DownloadQueue代表具有优先级的下载队列,该类的存储下载请求的数组链表专门按一定的优先级来存储下载请求的.该类的类图如下. 下载队列类DownloadQueue各个字段的含义说明如 ...

  6. WorldWind源码剖析系列:插件类Plugin、插件信息类PluginInfo和插件编译器类PluginCompiler

    插件类Plugin是所有由插件编译器加载的插件子类的抽象父类,提供对插件的轻量级的访问控制功能. 插件信息类PluginInfo用来存储关于某个插件的信息的类,可以理解为对插件类Plugin类的进一步 ...

  7. WorldWind源码剖析系列:BMNG类构造函数深入分析

    BMNG构造函数深入分析 一.主要类图 二.主要功能: 1)        BMNG类 BMNG类将包含以“Blue Marble”为主题的所有可渲染影像的根节点添加到当前星球的可渲染对象列表中,包括 ...

  8. WorldWind源码剖析系列:日志类Log

    Utility工程中的日志类Log主要用来输出Debug状态下的调试信息.该类的类图如下: 日志类Log中使用到的类和内嵌结构体类型主要有以下这些: public class LogEventArgs ...

  9. WorldWind源码剖析系列:相机类CameraBase

    相机基类CameraBase PluginSDK中的相机类CameraBase是三维计算机图形学中的概念.观察者在三维场景中漫游时,通过眼睛看到的场景和相机拍摄过程非常一致.实际上,Direct3D和 ...

  10. WorldWind源码剖析系列:角度类Angle

    PluginSDK中的角度结构体Angle类图如下所示. 角度结构体主要定义了一个弧度表示角度值的字段:double Radians.还有几个表示角度最大值.最小值.非数值和零角度等字段.定义了一个D ...

随机推荐

  1. Graveyard(poj3154)

    Graveyard Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1289   Accepted: 660   Specia ...

  2. @Schedul 中cron的命名规则

    @Schedul注解的定时任务详解 1.springboot集成schedule由于Spring Schedule包含在spring-boot-starter基础模块中了,所有不需要增加额外的依赖. ...

  3. SQLServer 事物与索引

    SqlServer 事物与索引 分享by:授客 QQ:1033553122 详情点击百度网盘分享链接: SqlServer 事物与索引.ppt

  4. SurfaceViewVideoList网络获取视频播放

    主布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:andro ...

  5. MVC与单元测试实践之健身网站(二)-管理员模块

    开始动手做这个项目时,发现无法做到完全的先设计.再编码,于是决定分模块进行,从管理员模块开始设计.编码,而且接口就已经改了好几次了. 管理员模块涉及的功能有登录和后台对管理员的维护,其中也涉及前端的开 ...

  6. 大数据【七】HBase部署

    接着前面的Zookeeper部署之后,现在可以学习HBase了. HBase是基于Hadoop的开源分布式数据库,它以Google的BigTable为原型,设计并实现了具有高可靠性.高性能.列存储.可 ...

  7. 安卓基础之Get方式发送http请求

    本文参考作者:超超boy 链接:https://www.cnblogs.com/jycboy/p/post01.html 一.在android用Get方式发送http请求,使用的是java标准类. 主 ...

  8. 获取windows鼠标的当前坐标

    #先下载pyautogui库,pip install pyautogui import os,time import pyautogui as pag try: while True: print ( ...

  9. Java语言的特点以及Java与C/C++的异同

    Java语言的特点 1. Java为纯面向对象的语言,能够直接反应现实生活中的对象,容易理解,编程更容易. 2.跨平台,java是解释性语言,编译器会把java代码变成中间代码,然后在JVM上解释执行 ...

  10. 解决 jQuery validation插件 valid()方法总是返回true的问题

    在表单元素验证方法中加入了 remote 方法,调试一直返回true,后来才知道因为是异步验证,所以才会出现此问题,解决方法就是在 remote 方法中,禁用 异步和缓存,具体代码如下 : ..... ...