Pregunta

Tengo un componente de tilleist usando un renderizador basado en IMAGECELL personalizado. Sé que, a veces, algunas de las imágenes que intentan recuperar no se encontrarán y puedo manejar esto a través de un oyente de Ieorror en el cargador personalizado de ImageCell.

Sin embargo, si configuré el proveedor de datos, entonces se cambia antes de que todas las imágenes hayan completado su proceso de carga o error, el reproductor de depuración de Flash le arroja un error no controlado # 2044 en Firefox que indica que no se pudo encontrar una imagen. En la ópera con el reproductor de depuración, lanza un # 2044 indicando que una carga nunca completada.

No puedo encontrar una manera de atrapar e ignorar estos errores para que no tire el diálogo del jugador del depurador. Además, al usar el IDE Flash Builder para depurar, el depurador no se rompe en estos errores, es solo en el jugador mientras puedo romper con otros errores sin problemas.

Es como si el escuchador de error se está eliminando cuando cambia el DataProvider, pero el cargador continúa y lanza un # 2044 no manejado.

¿Alguna idea sobre cómo manejar Effectivel? Gracias de antemano por su tiempo y asistencia -

b

¿Fue útil?

Solución

En el constructor de su renderizador de células personalizadas, debe agregar un escuchador de eventos a la instancia protegida cargador y maneje el ioerror.

Aquí hay un ejemplo:

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);
        }
    }
}

Aquí hay una prueba simple que hice para ver qué sucede cuando se actualiza el proveedor de datos:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top