데이터 제공자를 변경할 때 플래시 타일 목록에서 처리되지 않은 #2044 오류를 처리하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/3214414

문제

사용자 정의 ImageCell 기반 항목 렌더러를 사용하는 타일리스트 구성 요소가 있습니다.때때로 검색하려는 이미지 중 일부를 찾을 수 없다는 것을 알고 있으며 사용자 정의 ImageCell 로더의 IEOrror 리스너를 통해 이 문제를 처리할 수 있습니다.

그러나 데이터 공급자를 설정한 다음 모든 이미지가 로드 또는 오류 프로세스를 완료하기 전에 변경되면 플래시 디버그 플레이어는 Firefox에서 이미지를 찾을 수 없다는 처리되지 않은 #2044 오류를 표시합니다.디버그 플레이어를 사용하는 오페라에서는 로드가 완료되지 않았다는 #2044가 발생합니다.

디버거 플레이어 대화 상자가 표시되지 않도록 이러한 오류를 포착하고 무시하는 방법을 찾을 수 없습니다.또한 디버그를 위해 Flash Builder IDE를 사용할 때 디버거는 이러한 오류에 대해 전혀 중단되지 않습니다. 다른 오류에 대해서는 문제 없이 중단할 수 있지만 플레이어에서만 중단됩니다.

이는 데이터 제공자가 변경될 때 오류 리스너가 삭제되는 것과 같지만 로더는 계속해서 처리되지 않은 #2044를 발생시킵니다.

효과적으로 처리하는 방법에 대한 아이디어가 있습니까?귀하의 시간과 도움에 미리 감사드립니다 -

도움이 되었습니까?

해결책

사용자 정의 셀 렌더러의 생성자에서 보호된 셀 렌더러에 이벤트 리스너를 추가해야 합니다. 짐을 싣는 사람 인스턴스를 생성하고 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top