簡體   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