WorldWind源码剖析系列:网络下载类WebDownload
网络下载类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的更多相关文章
- WorldWind源码剖析系列:设置类SettingsBase
PluginSDK中的星球设置类WorldSettings 和WorldWind.程序设置类WorldWindSettings均继承自父类SettingsBase.类图如下所示.其中父类Setting ...
- WorldWind源码剖析系列:下载请求类DownloadRequest
下载请求类DownloadRequest是各种下载请求的抽象基类,先派生出网络下载请求类WebDownloadRequest,再派生出地理空间下载请求类GeoSpatialDownloadReques ...
- WorldWind源码剖析系列:挂件类Widgets
WorldWindow用户定制控件类中所包含的的挂件类Widgets控件主要有如下图所示的派生类.它们的类图如下所示. 鉴于挂件类Widgets及其派生类,相对简单,基本上都是些利用DirectX3D ...
- WorldWind源码剖析系列:缓冲类Cache
缓冲类Cache主要用于在最小的限制条件下保存从远程服务器通过网络下载下来的地理空间数据,以便当用户处于离线状态时能够使用这些已经缓冲好的数据.Google Earth也采用类似机制处理用户离线浏览漫 ...
- WorldWind源码剖析系列:下载队列类DownloadQueue
下载队列类DownloadQueue代表具有优先级的下载队列,该类的存储下载请求的数组链表专门按一定的优先级来存储下载请求的.该类的类图如下. 下载队列类DownloadQueue各个字段的含义说明如 ...
- WorldWind源码剖析系列:插件类Plugin、插件信息类PluginInfo和插件编译器类PluginCompiler
插件类Plugin是所有由插件编译器加载的插件子类的抽象父类,提供对插件的轻量级的访问控制功能. 插件信息类PluginInfo用来存储关于某个插件的信息的类,可以理解为对插件类Plugin类的进一步 ...
- WorldWind源码剖析系列:BMNG类构造函数深入分析
BMNG构造函数深入分析 一.主要类图 二.主要功能: 1) BMNG类 BMNG类将包含以“Blue Marble”为主题的所有可渲染影像的根节点添加到当前星球的可渲染对象列表中,包括 ...
- WorldWind源码剖析系列:日志类Log
Utility工程中的日志类Log主要用来输出Debug状态下的调试信息.该类的类图如下: 日志类Log中使用到的类和内嵌结构体类型主要有以下这些: public class LogEventArgs ...
- WorldWind源码剖析系列:相机类CameraBase
相机基类CameraBase PluginSDK中的相机类CameraBase是三维计算机图形学中的概念.观察者在三维场景中漫游时,通过眼睛看到的场景和相机拍摄过程非常一致.实际上,Direct3D和 ...
- WorldWind源码剖析系列:角度类Angle
PluginSDK中的角度结构体Angle类图如下所示. 角度结构体主要定义了一个弧度表示角度值的字段:double Radians.还有几个表示角度最大值.最小值.非数值和零角度等字段.定义了一个D ...
随机推荐
- SSM(一):spring-ioc
一.java代理模式 java代理模式是ioc的前置知识.代理模式非常简单,看代码就一目了然了. public interface role { public void makeMoney(); } ...
- 利用JavaMail发送邮件:smtp.163.com
一.利用JavaMail发送邮件案例: 1.maven项目结构: 2.先在pom.xml里边加入Javamail依赖,系统会根据坐标自动下载mail包(前提是配置好了maven): 3.配置email ...
- Oracle总结之plsql编程(基础八)
原创作品,转自请注明出处:https://www.cnblogs.com/sunshine5683/p/10328524.html 一.函数 1.函数是可以返回一个特定的数据,函数的创建中必须包含re ...
- 多线程系列(2)线程池ThreadPool
上一篇文章我们总结了多线程最基础的知识点Thread,我们知道了如何开启一个新的异步线程去做一些事情.可是当我们要开启很多线程的时候,如果仍然使用Thread我们需要去管理每一个线程的启动,挂起和终止 ...
- Android-远程Service
http://blog.csdn.net/guolin_blog/article/details/9797169 http://www.jianshu.com/p/eeb2bd59853f 将一个普通 ...
- 分页插件 jquery.pagination.js
引用 <script src="http://www.jq22.com/jquery/jquery-1.10.2.js"></script> <lin ...
- JS--我发现,原来你是这样的JS(引用类型不简单[上篇],且听我娓娓道来)
一.介绍 没错,这是第五篇,到了引用类型,这次要分成两次博文了,太多内容了,这是前篇,篇幅很长也很多代码,主要讲引用类型和常用的引用类型,代码试验过的,老铁没毛病. 坚持看坚持写,不容易不容易,希望大 ...
- JavaScript修改日期格式
<script> //封装时间格式 function format(time, format) { var t = new Date(time); var tf = function (i ...
- 腾讯Ocr文字识别
简述 上篇文章记录了百度Ocr的两种模式用法,接下来这篇文章开始记录腾讯Ocr的使用方法.腾讯Ocr的通用印刷体识别模式使用比较简单,直接接入sdk即可,但手写体的识别相对比较麻烦,需要自己post表 ...
- Android--解决EditText放到popupWindow中,原有复制、粘贴、全选、选择功能失效问题
1.原来是将EditView放到了popupwindow,发现EditView原有的复制.粘贴.全选.选择功能失效了,所以便用DialogFragment代替了popupWindow 直接上代码 ①. ...