这里的第一个问题;希望你能帮忙。我完全陷入了困境。
我创建了一个预加载图像的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 - 看看是否有人可以重现上述问题......
谢谢!
答案 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? :)