如何处理闪烁的#2044在更改DataProvider时从闪存Tilelist的错误?
-
13-09-2020 - |
题
我使用基于自定义ImageCell的项目渲染器具有TileList组件。我知道,有时它试图检索的一些图像,我能够通过自定义ImageCell加载程序上的IEORROR侦听器来处理这个图像。
<但是,如果我设置数据提供程序,那么它在所有图像完成加载或错误过程之前都会改变,闪存调试播放器在Firefox中抛出未处理的#2044错误,说明找不到图像。在使用调试播放器的Opera中,它抛出#2044,指出了从未完成的负载。我找不到一种陷阱和忽略这些错误的方法,因此他们不会抛出调试器播放器对话。此外,在使用Flash Builder IDE调试时,调试器根本不会破坏这些错误 - 它只是在播放器中,而我能够在没有问题的情况下打破其他错误。
就好像是误差侦听器正在进行DataProvider更改时,但是加载程序继续并抛出未处理的#2044。
关于如何处理结果的任何想法?提前感谢您的时间和帮助 -
b
解决方案
在自定义单元格渲染器的构造函数中,您需要将事件侦听器添加到受保护的 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
不隶属于 StackOverflow