Как обрабатывать необработанные ошибки #2044 из списка плиток Flash при смене поставщика данных?
У меня есть компонент списка листов, использующий пользовательское средство визуализации элементов на основе ImageCell. Я знаю, что иногда некоторые изображения, которые он пытается получить, не могут быть найдены, и я могу справиться с этим через прослушиватель IEOrror в пользовательском загрузчике ImageCell.
Однако, если я установлю провайдера данных, то он будет изменен до того, как все изображения завершат свою загрузку или обработку ошибки, проигрыватель отладки флэш-памяти выдает необработанную ошибку #2044 в firefox, сообщающую, что изображение не может быть найдено. В опере с игроком отладки он выдает #2044, заявляя, что загрузка не завершена.
Я не могу найти способ отловить и проигнорировать эти ошибки, чтобы они не бросали диалог игрока отладчика. Кроме того, при использовании IDE Flash Builder для отладки отладчик вообще не работает с этими ошибками - он только в проигрывателе, в то время как я могу без проблем работать с другими ошибками.
Это похоже на то, как будто прослушиватель ошибок удаляется при смене поставщика данных, но загрузчик продолжает работу и выдает необработанный #2044.
Любые идеи о том, как справиться с эффективностью? Заранее спасибо за ваше время и помощь -
б
1 ответ
В конструкторе вашего пользовательского средства визуализации ячеек вам нужно добавить прослушиватель событий в защищенный экземпляр загрузчика и обработать ошибку 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;
}
НТН