我们可以使用URLLoader来发送超文本传输协议请求和监听来自服务器的事件。我的问题是,URLLoader在哪里以及如何调度完成、进度、ioError事件?因为在服务器端,我们不调用dispatchEvent。
代码如下:
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, completeHandler);
loader.addEventListener(ProgressEvent.PROGRESS, progressHandler);
loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
loader.load(new URLRequest("http://example/lookup"));哪个对象调度前面提到的事件,它在哪里调度?
发布于 2013-01-14 20:41:05
它们是由虚拟机触发的,最初它发生在浏览器的NPAPI (例如Gecko API reference )或chrome中的PPAPI的某个地方(我猜,我不确定这一点)。
发布于 2013-01-16 00:09:20
URLLoader通过HTTP头做到这一点。我对Headers不是很熟悉,但我知道以下几点(根据经验加上阅读LiveDocs):
只要下载取得进展,就会以固定的时间间隔(在Flash SDK中预定义)调度
ProgressEvent.PROGRESS。它不会对下载的每个字节进行调度,也不存在任何关于如何调度的押韵或原因,除了似乎是从Content-Length标头中获取的常规时间intervalbytesTotal属性。如果你在请求中发送一个Range头部,那么它应该会否定响应中的Content-Length头部,你会得到0 bytesTotal。您可以通过侦听HTTPStatusEvent.HTTP_STATUS_RESPONSE、遍历报头并查找Content-Range报头来解决此问题。您可以使用RegEx从内部处理的Object.bytesLoaded属性中获取长度。URLLoader保存下载到ByteArray的每个字节,bytesLoaded只是字节数组的length属性Event.COMPLETE是如何触发的,但我相信当根据Flash SDK内部预定义的情况调度连接时,就会发生这种情况。最常见的情况是,它会在发生404错误时进行调度。除此之外,我不确定。除了在每个请求中发送有效的HTTP头之外,您不应该在服务器端做任何事情来正确地触发这些事件。在很大程度上,一切都是在内部处理的。
我强烈建议阅读LiveDocs。它们非常详细,并且仍然以一种非常有用和信息丰富的方式编写,这在编码文档中非常少见
https://stackoverflow.com/questions/14318169
复制相似问题