AS3 - 预加载器偶尔不会加载图像或外部swf

时间:2009-09-25 17:05:39

标签: flash actionscript-3 actionscript preloader

这里的第一个问题;希望你能帮忙。我完全陷入了困境。

我创建了一个预加载图像的Flash幻灯片。在预加载图像后,它继续加载外部闪存文件,然后加载图像。问题是,非常偶尔,它将无法将图像实际加载到视图中,我只会看到预加载动画,但它仍然可能加载外部swf。此外,它可能会反过来,并加载图像而不加载外部swf。

我无法重现后者,尽管客户已经在几次注意到它。前者会发生在我身上,但很少发生。

这是(我认为)相关代码:

function onXMLLoadComplete(e:Event):void {
// create new xml with the received data
xmlSlideshow = new XML(e.target.data);
// get total slide count
// misc xml data
info_holder.mcInfo.lbl_tagline.text = xmlSlideshow.misc.@tagline;
info_holder.mcInfo.goToUrl_btn.lbl_view.text = xmlSlideshow.misc.@view.toUpperCase();

intSlideCount = xmlSlideshow..img.length();
//trace(intSlideCount);
imageArray = new Array(intSlideCount);

for (var i:int = 0; i < intSlideCount; i++) {
    //imageArray[i] = new URLRequest(xmlSlideshow..img[i].@src);    
    var loader:Loader = new Loader();
    loader.load(new URLRequest(xmlSlideshow..img[i].@src));
    //trace(xmlSlideshow..img[i].@src);
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoadComplete); 
    //loader.load(imageArray[i]);
  }
}

function onImageLoadComplete(e:Event):void {

if (++numberOfImagesLoaded == intSlideCount) {
    // animate the info bar and then
    //trace(intSlideCount);
    //trace(numberOfImagesLoaded);
    info_holder.play();
    // switch the first slide without a delay   
    // reset index of images
    //load map div via jQuery
    if (ExternalInterface.available) {
        ExternalInterface.call('openMap');
    }
    intCurrentSlide = -1;
    switchSlide(null);
  }
}

直播网站位于:http://www.luxuryportfolio.com - 看看是否有人可以重现上述问题......

谢谢!

5 个答案:

答案 0 :(得分:4)

这里需要注意的一件重要事情是,您最有可能导致此问题。你的代码很好,不要误解我的意思,但是迭代数组并在每次迭代时创建加载器和加载是一个坏主意。以下内容可以介绍您遇到的问题。大多数人,包括我自己,都使用预算托管(BLUEHOST个人),它们非常适合它们,但通常是共享框,您希望优化网站的加载方式。解决这个问题的方法非常简单。

说明:

我们将自己优雅地处理每个负载,而不是仅仅使用一个接近瞬间的for循环迭代数组。完成后,下一个将开始,直到我们用作数据提供者的数组为空。话虽这么说,你需要创建一个函数来开始加载第一个和后面的图像。

private var images:Array = ["image1.jpg", "image2.jpg"];

private function _loadImage():void
{
    var loader:Loader = new Loader();
    var req:URLRequest = new URLRequest(images.shift()); //Removes and returns first element in an array.
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE. _onImageComplete);
}

private function _onImageComplete(e:Event):void
{
    var bmp:Bitmap = e.target.content as Bitmap;
    _someContainer.addChild(bmp);
    if(images.length > 0) _loadImage(); //Calls _loadImage function until array is empty.
}

通过上述方法,无论如何,您的网站实际上应该加载更快,并且它会对负载产生良好的线性效果,从左到右,从上到下,或者您的图像编程布局。

ALSO:

您需要侦听异步错误事件并捕获同步错误。如果发生错误,使用这些处理程序和一些直观的代码,您的图库可以让自己知道存在错误,并且错误发生在哪个位置;这样它只能从那个地方开始加载,无论是备份数字还是重新开始迭代数组。

我不打算这是侮辱,因为我真的不确定,但任何Flash开发人员都应该使用Flash Player 10调试器,并在附注中,像火狐一样用于http嗅探和是必须的,但在这种特殊情况下,调试器会告诉你很多。

从您网站的实时跟踪中,我看到了一些有趣的警告,这些警告也应该得到解决。

祝你好运。

答案 1 :(得分:1)

问题出在这里:

    var loader:Loader = new Loader();
    loader.load(new URLRequest(xmlSlideshow..img[i].@src));
    //trace(xmlSlideshow..img[i].@src);
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoadComplete); 
    //loader.load(imageArray[i]);

在此块结束时,您创建的Loader对象超出了范围;什么都没有提到它,所以它有资格进行垃圾收集,即在某些时候(不可预测)Flash播放器将清除为该对象分配的内存。

大多数情况下,GC不会启动一段时间,因此您的负载可能会起作用。但有时候,GC会启动,你会丢失一些加载器对象。

所以 - 坚持你的装载机!将它们存储在另一个数组中(与images数组一起就可以了)然后在每个数组COMPLETE之后清除它们。

顺便说一下,总是更好地执行此操作:

var loader:Loader = new Loader();
// Note the position of this line!
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoadComplete); 
loader.load(new URLRequest(xmlSlideshow..img[i].@src));

而不是:

var loader:Loader = new Loader();
loader.load(new URLRequest(xmlSlideshow..img[i].@src));
// Note the position of this line!
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoadComplete); 

因为在某些情况下缓存加载文件,COMPLETE会在您添加监听器之前触发!在所有情况下,确保在之前添加侦听器,以启动可能触发事件的操作。希望这有帮助!

答案 2 :(得分:0)

查看您的(漂亮)图库时没问题。您是否尝试过将错误处理程序添加到加载程序中?

loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);
function onError(e:IOErrorEvent) {
    trace("Catch error in a log file")
}

答案 3 :(得分:0)

如果您尝试追踪间歇性错误,则第一步是注册Loader可以触发的错误处理事件。您的加载程序可能正在经历与服务器或某些人的定期通信错误,而这些警报只是陷入黑洞,所以您看到这种不稳定的行为。

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/Loader.html#load%28%29

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/events/IOErrorEvent.html

答案 4 :(得分:0)

另一个解决方案可能是使用Hydrotik的QueueLoader。看看:

http://code.google.com/p/queueloader-as3/

对我来说就像一个魅力。祝好运。

BTW:任何人都有任何刷新问题与Flash播放器没有在IE7中激活加载COMPLETE? :)