1

这里的第一个问题;希望你能帮忙。我完全糊涂了。

我创建了一个预加载图像的 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 - 看看你们中是否有人可以重现上述问题......

谢谢!!

4

5 回答 5

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

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

还:

您需要监听异步错误事件并捕获同步错误。如果发生错误并且当发生错误时,使用这些处理程序和一些直观的代码,您的画廊可以让自己知道发生了错误以及错误发生的时间点;这样,它只能从该位置开始加载,无论是备份一个数字并重新启动以遍历数组。

我不打算这是侮辱性的,因为我真的不确定,但是任何 Flash 开发人员都应该使用 Flash Player 10 调试器,并且在旁注中,诸如用于 http 嗅探等的带有 firebug 的 Firefox 之类的东西是必须,但在这种特殊情况下,调试器会告诉你很多。

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

祝你好运。

于 2009-09-26T15:28:43.997 回答
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会在您添加侦听器之前触发!确保在开始可能触发事件的操作之前添加侦听器,在所有情况下。希望这可以帮助!

于 2009-09-29T16:19:44.020 回答
0

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

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

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

顺便说一句:在 IE7 中没有触发加载 COMPLETE 的 Flash 播放器是否有任何刷新问题?:)

于 2009-12-10T17:34:28.480 回答
0

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

loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);
function onError(e:IOErrorEvent) {
    trace("Catch error in a log file")
}
于 2009-09-25T17:18:14.573 回答
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

于 2009-09-25T17:20:25.240 回答