[英]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.