Как обрабатывать необработанные ошибки # 2044 из списка плиток Flash при смене поставщика данных? - PullRequest
0 голосов
/ 09 июля 2010

У меня есть компонент списка листов, использующий пользовательское средство визуализации элементов на основе ImageCell. Я знаю, что иногда некоторые изображения, которые он пытается получить, не могут быть найдены, и я могу справиться с этим через прослушиватель IEOrror в пользовательском загрузчике ImageCell.

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

Я не могу найти способ отловить и игнорировать эти ошибки, чтобы они не вызывали диалог игрока отладчика. Кроме того, при использовании IDE Flash Builder для отладки отладчик вообще не работает с этими ошибками - он работает только в проигрывателе, а я могу без проблем работать с другими ошибками.

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

Есть идеи, как справиться с эффективностью? Заранее благодарим за ваше время и помощь -

B

1 Ответ

2 голосов
/ 10 июля 2010

В конструкторе пользовательского средства визуализации ячеек необходимо добавить прослушиватель событий в защищенный экземпляр loader и обработать ошибку IOError.

Вот пример:

package
{
    import fl.controls.listClasses.ICellRenderer;
    import fl.controls.listClasses.ImageCell;
    import fl.controls.TileList;
    import fl.data.DataProvider;
    import fl.managers.StyleManager;
    import flash.events.EventDispatcher;
    import flash.events.*;
    import fl.containers.UILoader;

    public class CustomImageCell extends ImageCell implements ICellRenderer
    {  

        public function CustomImageCell() 
        {
            super();

            //do other stuff here

            loader.scaleContent = false;
            loader.addEventListener(IOErrorEvent.IO_ERROR, handleErrorEvent, false, 0, true);

            useHandCursor = true;
        }

        override protected function drawLayout():void
        {
            var imagePadding:Number = getStyleValue("imagePadding") as Number;
            loader.move(11, 5);

            var w:Number = width-(imagePadding*2);
            var h:Number = height-imagePadding*2;
            if (loader.width != w && loader.height != h)
            {
                loader.setSize(w,h);
            }
            loader.drawNow(); // Force validation!

        }
        override protected function handleErrorEvent(event:IOErrorEvent):void {
            trace('ioError: ' + event);
            //dispatchEvent(event);
        }
    }
}

вот простой тест, который я сделал, чтобы увидеть, что происходит, когда поставщик данных обновляется:

import fl.controls.*;
import fl.data.DataProvider;
import fl.controls.listClasses.CellRenderer;

stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;

var tileList:TileList = new TileList ();
tileList.move(220,40);
tileList.setSize(215, 400);
tileList.columnWidth = 215;
tileList.rowHeight = 86;
tileList.direction = ScrollBarDirection.VERTICAL;
tileList.setStyle("cellRenderer", CustomImageCell);
addChild(tileList);

tileList.dataProvider = getRandomDP(10);
setTimeout(resetDP,3000);

function resetDP():void {
    tileList.dataProvider = getRandomDP(10);
}
function getRandomDP(size:int):DataProvider {
    var result:DataProvider = new DataProvider();
    for(var i:int = 0; i < size; i++)   result.addItem({label:'item'+i,source:'wrong.url/'+Math.random()});
    return result;
}

НТН

...