繁体   English   中英

AS3-预加载器有时不会加载图像,也不会加载外部SWF文件

[英]AS3 - preloader occasionally won't load images, or external swf

这里的第一个问题; 希望能对您有所帮助。 我完全被弄糊涂了。

我创建了一个Flash幻灯片演示,可以预加载图像。 预加载图像后,它将继续加载外部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-看看是否有人可以重现上述问题...

谢谢!!

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

说明:

我们将不仅仅通过遍历即时的for循环遍历数组,还可以自行处理每个负载。 完成后,下一个将开始,直到我们用作dataprovider的数组为空。 就是说,您需要创建一个函数来开始加载第一张和第二张图像。

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.
}

有了以上内容,您的网站实际上无论如何应该加载得更快,并且对加载有很好的线性效果,从左到右,从上到下,或者您的程序可以对图像进行布局。

也:

您需要侦听异步错误事件并捕获同步错误。 如果并且当发生错误时,只要有了这些处理程序以及一些直观的代码,您的图库就可以让自己知道发生了错误,并在错误发生的那一点; 这样,它就只能从该位置开始加载,而不管它是备份一个数字并重新开始遍历数组。

我不希望这是侮辱性的,因为我确实不确定,但是任何Flash开发人员都应使用Flash Player 10调试器,并且附带说明一下,诸如Firefox和Firebug的HTTP嗅探之类的功能都是可以使用的。必须,但在这种特殊情况下,调试器会告诉您很多信息。

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

祝好运。

问题在这里:

    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 Player将清除为该对象分配的内存。

在大多数情况下,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将触发! 开始操作之前,请确保在所有情况下都添加了侦听器这可能会引发事件。 希望这可以帮助!

查看您的(漂亮)画廊我没有问题。 您是否尝试过将错误处理程序添加到加载程序?

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

如果您尝试查找间歇性错误,则第一步是注册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

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

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

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

顺便说一句:有人在Flash播放器没有触发IE7中的“加载完成”时遇到任何刷新问题吗? :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM