2009-09-25 2 views
1

Первый вопрос здесь; надеюсь, вы можете помочь. Я полностью смущен.AS3 - предварительный загрузчик иногда не загружает изображения или внешний swf

Я создал флэш-слайд-шоу, которое предварительно загружает изображения. После предварительной загрузки изображений он начинает загружать внешний файл флэш-памяти, а затем изображения. Проблема в том, что очень редко, она не сможет загружать изображения в реальность, и я просто увижу анимацию предварительной загрузки, но она может по-прежнему загружать внешний 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 = [email protected]; 
info_holder.mcInfo.goToUrl_btn.lbl_view.text = [email protected](); 

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][email protected]);  
    var loader:Loader = new Loader(); 
    loader.load(new URLRequest(xmlSlideshow..img[i][email protected])); 
    //trace(xmlSlideshow..img[i][email protected]); 
    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

У меня не возникло проблем с просмотром вашей (красивой) галереи. Вы пытались добавить обработчик ошибок к своему загрузчику?

loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError); 
function onError(e:IOErrorEvent) { 
    trace("Catch error in a log file") 
} 
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

Важная вещь, чтобы отметить здесь, что вы, скорее всего, в результате чего этот вопрос. Ваш код хорош, не поймите меня неправильно, но это плохая идея итерации по массиву и создания загрузчиков и загрузки на каждой итерации. Ниже перечислены проблемы, с которыми вы сталкиваетесь. Большинство людей, в том числе и я, используют бюджетный хостинг (BLUEHOST лично), которые отлично подходят для них, но, как правило, являются совместно используемыми ящиками, и вы хотите оптимизировать, как загружаются ваши сайты. Путь вокруг этого довольно прост.

ОБЪЯСНЕНИЕ:

Вместо того, чтобы просто перебором массива с цикл, который чертовски близко к моменту, мы будем корректно обрабатывать каждую нагрузку сами по себе; после завершения будет запущено следующее, пока массив, который мы используем в качестве датапараудера, пуст. При этом вам нужно создать функцию, чтобы начать загрузку первого и последующих изображений.

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 Player 10 Debugger, а на стороне заметки такие вещи, как Firefox с firebug для http sniffing и т. д. являются обязательными, но в этом конкретном случае отладчик сказал бы вам много.

Из живой трассы вашего сайта я вижу несколько интересных предупреждений, которые, вероятно, также должны быть рассмотрены.

Удачи.

1

Проблема здесь:

var loader:Loader = new Loader(); 
    loader.load(new URLRequest(xmlSlideshow..img[i][email protected])); 
    //trace(xmlSlideshow..img[i][email protected]); 
    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][email protected])); 

вместо этого:

var loader:Loader = new Loader(); 
loader.load(new URLRequest(xmlSlideshow..img[i][email protected])); 
// Note the position of this line! 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoadComplete); 

, потому что в некоторых случаях, когда кэшированные файл загрузки, COMPLETE будет активироваться до вы добавили слушателя! Убедитесь, что вы добавили слушателей до, вы запускаете операцию, которая может запускать события во всех ситуациях. Надеюсь это поможет!

+1

Ох - как еще в стороне, Брайан прав, что Flash может задохнуться, если вы загружаете слишком много файлов одновременно, а в некоторых крайних случаях на самом деле сбой браузера (я получил много в AS2); часто лучше ставить в очередь их, как он предлагает, хотя на практике мы обнаружили, что загрузка 5-10 одновременно прекрасна. – IanT

+0

yup, слушатели перед загрузкой. Всегда будьте готовы. :) –

0

Другим решением может быть использование QueueLoader от Hydrotik. Посмотрите:

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

работает как шарм для меня. Удачи.

BTW: у кого есть какие-либо из этих проблем с обновлением flash-плеера, не запускающего загрузку ПОЛНЫЙ в IE7? :)

Смежные вопросы