如何在更改dataprovider时处理来自Flash tilelist的未处理的#2044错误?

时间:2010-07-09 16:01:52

标签: flash actionscript-3 tilelist ioerror flash-v3-components

我有一个使用基于ImageCell的自定义项呈示器的tilelist组件。我知道有时会找不到它试图检索的一些图像,我可以通过自定义ImageCell加载器上的IEOrror监听器来处理它。

但是,如果我设置数据提供程序,然后在所有图像完成加载或错误处理之前更改,则Flash调试播放器会在firefox中抛出未处理的#2044错误,指出无法找到图像。在使用调试播放器的Opera中,它会抛出一个#2044,说明负载从未完成。

我找不到陷阱和忽略这些错误的方法,因此他们不会抛出调试器播放器对话框。此外,当使用Flash Builder IDE进行调试时,调试器根本不会破坏这些错误 - 它只在播放器中,而我能够在没有问题的情况下打破其他错误。

当数据提供者发生更改时,好像处理了错误侦听器,但加载程序继续并抛出未处理的#2044。

关于如何处理有效的任何想法?提前感谢您的时间和帮助 -

B'/ P>

1 个答案:

答案 0 :(得分:2)

在Custom Cell Renderer的构造函数中,您需要向受保护的 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;
}

HTH