【问题标题】:How to handle Unhandled #2044 errors from Flash tilelist when changing dataprovider?更改数据提供程序时如何处理来自 Flash tilelist 的 Unhandled #2044 错误?
【发布时间】:2010-07-09 16:01:51
【问题描述】:

我有一个使用基于自定义 ImageCell 的项目渲染器的 tilelist 组件。我知道有时会找不到它尝试检索的某些图像,我可以通过自定义 ImageCell 加载器上的 IEOrror 侦听器来处理这个问题。

但是,如果我设置数据提供程序,然后在所有图像完成加载或错误过程之前更改它,flash 调试播放器会在 Firefox 中引发未处理的 #2044 错误,说明找不到图像。在带有调试播放器的 Opera 中,它会抛出 #2044 说明加载从未完成。

我找不到捕获和忽略这些错误的方法,因此它们不会抛出调试器播放器对话。此外,当使用 Flash Builder IDE 进行调试时,调试器根本不会中断这些错误 - 它只是在播放器中,而我能够毫无问题地中断其他错误。

当数据提供者改变时,就好像错误监听器正在被释放,但加载器继续并抛出一个未处理的#2044。

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

b

【问题讨论】:

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


    【解决方案1】:

    在自定义单元格渲染器的构造函数中,您需要向受保护的 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

    【讨论】:

    • 我就是这么做的。处理程序在瓦片列表加载时捕获 IOErrors,但如果我更改 dataprovider,我会得到未处理的那些,就好像在 dataprovider 更改期间应该处理的加载程序然后发送不再处理的 IOErrorEvents,因为加载程序本身是走了。
    • @WillyCornbread 这就是您更改数据提供者的意思吗?在我的小测试中,即使数据提供者发生变化,行为也是一样的。
    • George - 解决方案确实在您的原始答案中。我将自己的 IORErrorEvent 处理程序添加到受保护的加载程序,但没有覆盖加载程序的受保护的“handleErrorEvent”方法。一旦我使用了它的覆盖,问题就停止了。非常感谢您的帮助。
    • @WillyCornbread 哦,我偶然发现了这个问题:stackoverflow.com/questions/101532/…“Flash 10.1 和 AIR 2.0(均处于测试阶段)现在支持全局错误处理,并且通过订阅 LoaderInfo 的 UNCAUGHT_ERROR 事件来实现.uncaughtErrorEvents。以下代码取自 livedocs 上的代码示例:" ...很高兴知道 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2014-05-29
    相关资源
    最近更新 更多