Flash URLLoader在轮询时卡住
更新:当在浏览器中运行flash时,这会起作用,但如果从IDE运行,则不起作用。如果遇到同样的问题,您可能需要尝试在浏览器中运行。 我正在制作一个聊天应用程序,它使用Flash&Actionscript 3.0从我的服务器上反复读取文本文件。我正在用URLLoader打开文件,它一开始工作正常。然而,在大约10次调用之后,URLLoader被卡住了 它不提供完成事件,不提供安全错误,不提供状态事件,也不引发异常。它根本就不会触发任何事件。我甚至在URL中添加了一个随机值,以确保它不是缓存问题。当然,我可以检测到它什么时候卡住了,但似乎没有任何方法可以解开它。即使我在URLLoader上调用close(),然后将其设置为null并创建另一个,它也不会恢复轮询 下面是轮询服务器并每两秒调用一次的函数Flash URLLoader在轮询时卡住,flash,networking,actionscript,Flash,Networking,Actionscript,更新:当在浏览器中运行flash时,这会起作用,但如果从IDE运行,则不起作用。如果遇到同样的问题,您可能需要尝试在浏览器中运行。 我正在制作一个聊天应用程序,它使用Flash&Actionscript 3.0从我的服务器上反复读取文本文件。我正在用URLLoader打开文件,它一开始工作正常。然而,在大约10次调用之后,URLLoader被卡住了 它不提供完成事件,不提供安全错误,不提供状态事件,也不引发异常。它根本就不会触发任何事件。我甚至在URL中添加了一个随机值,以确保它不是缓存问题。当
private function check_server() {
var url:String = "http://coworkthailand.com/say/snd/index.php?"+Math.random();
if (loader != null) {
trace("was already checking "+loader.bytesLoaded+" / "+loader.bytesTotal);
return;
}
loader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.TEXT;
loader.addEventListener(Event.COMPLETE, completeHandler);
loader.addEventListener(flash.events.IOErrorEvent.IO_ERROR,
function(e:Event) { loader = null; trace("fail"); })
loader.addEventListener(flash.events.SecurityErrorEvent.SECURITY_ERROR,
function(e:Event) { loader = null; trace("security error"); })
loader.addEventListener(flash.events.HTTPStatusEvent.HTTP_STATUS,
function(e:flash.events.HTTPStatusEvent) { trace("status "+e.status); });
try {
loader.load(new URLRequest(url));
} catch (error:Error) {
trace("Unable to load requested document.");
}
}
这不是一个重要的项目,但任何想法都将不胜感激 我在这里只是猜测,但可能Flash引擎被各种并行
URLLoader
s阻塞(如果出于某种原因一个被卡住了两秒钟多一点,那么您已经有两个了,以此类推)
我的想法是:使用一个
urloader
。在init()
函数中设置回调和事件挂钩,调用load()
,并在每次检查服务器更改时重用同一实例。这样,当URLLoader
仍处于忙碌状态时,新的加载请求将被忽略或取消上一个加载请求(不确定是哪个)。对于这种情况,最佳实践要求使用URLLoader的单个实例;你很可能在某个地方被相互竞争的电话阻塞了。同样,您可以尝试使用一个简单的标志来检测您的加载器在进行另一个调用之前是否正在处理现有的调用;下面是一个工作示例,使用单个加载器每五秒钟发出一次请求,显示单个加载器和“isOpen”检查:
您的对象也可能由于未连接到主对象图而被GC清理。使用Fiddler或Charles检查您的HTTP流量也是值得的,这可能会帮助您更好地了解正在发生的事情。浏览器通常只允许同时进行两个HTTP KeepAlive连接。其他连接被推迟。您所说的“工作”是指“问题是可复制的”,或者相反,它仅在IDE中可复制?(顺便说一句,哪个IDE?)不,不是这样。我经常在方法定义中使用URLLoader的作用域和创建,它们总是工作顺利。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="app_init()">
<mx:Script>
<![CDATA[
private var timer:Timer;
private var loader:URLLoader;
private var isOpen:Boolean;
private function app_init():void
{
timer = new Timer(5000)
timer.addEventListener(TimerEvent.TIMER, timer_tick, false, 0, true)
loader = new URLLoader();
loader.addEventListener(Event.OPEN, loader_open);
loader.addEventListener(Event.COMPLETE, loader_complete);
// Start the timer
timer.start();
}
private function timer_tick(event:TimerEvent):void
{
// Check if the loader's busy before calling load, and/or close()
if (!isOpen)
{
// loader.close();
loader.load(new URLRequest("http://mydomain.com/myfile.txt"));
}
}
private function loader_open(event:Event):void
{
// Mark as open
isOpen = true;
}
private function loader_complete(event:Event):void
{
// Do work
// Mark as closed
isOpen = false;
}
]]>
</mx:Script>
</mx:Application>