1

ここで最初の質問です。あなたが助けてくれることを願っています。私は完全に困惑しています。

画像をプリロードするフラッシュ スライドショーを作成しました。イメージをプリロードした後、外部フラッシュ ファイルをロードし、次にイメージをロードします。問題は、非常にまれに、実際に画像をビューにロードできず、プリロード アニメーションが表示されるだけで、外部 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 Debugger を使用する必要があります。必要がありますが、この特定のケースでは、デバッガーは多くのことを教えてくれます。

あなたのサイトのライブ トレースから、おそらく対処すべき興味深い警告がいくつか見られます。

幸運を。

于 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

あなたの(可愛い)ギャラリーを問題なく閲覧できました。ローダーにエラー ハンドラを追加してみましたか?

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

断続的なバグを追跡しようとする場合、最初のステップは、ローダーが起動できるエラー処理イベントに登録することです。あなたのローダーはおそらくサーバーなどとの定期的な通信エラーを経験しており、それらのアラートはブラックホールに陥っているだけなので、この不規則な動作が見られます.

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 に答える
0

別の解決策は、Hydrotik の QueueLoader を使用することです。見てみましょう:

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

私にとって魅力のように機能します。幸運を。

ところで: IE7 で、Flash Player がロード COMPLETE を起動しないというリフレッシュの問題を抱えている人はいますか? :)

于 2009-12-10T17:34:28.480 に答える