zoukankan      html  css  js  c++  java
  • as3 Loader.load()时出现错误“Error #2025: 提供的 DisplayObject 必须是调用者的子级”的解决方案

    最近因为项目需要,所以开始了as3的开发之旅。今天遇到一个问题,就是在用flash.display.Loader的load()方法的时候,如果反复调用load(),就会出现“Error #2025: 提供的 DisplayObject 必须是调用者的子级”的错误,核心代码如下:

    代码
            public function loadPhoto(picURL):void {
                _loader.load(
    new URLRequest(picURL));
                _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad);
                _loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);
            }
            
            protected 
    function onLoad(event:Event):void {
                content.addChild(_loader.content);
                _eventDispatcher.dispatchEvent(
    new Event(PhotoLoader.EVENTS_LOAD));
            }

    搜索了相关的问题,说是每次用到Loader对象的时候,都去new一下,就可以避免这个错误,试了试,果然可以正常使用了,代码改成这样:

    代码
            public function loadPhoto(picURL):void {
                _loader 
    = new Loader(); //这里多加了一条new Loader()的语句
                _loader.load(
    new URLRequest(picURL));
                _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad);
                _loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);
            }
            
            protected 
    function onLoad(event:Event):void {
                content.addChild(_loader.content);
                _eventDispatcher.dispatchEvent(
    new Event(PhotoLoader.EVENTS_LOAD));
            }

    不过每次都去new的话,内存开销肯定受不了,所以不敢采用这个方案,于是请教了涵涵同学,丫说可以把Loader对象直接作为Sprite对象的子节点,也就是改成这样

    代码
            public function loadPhoto(picURL):void {
                _loader.load(
    new URLRequest(picURL));
                _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad);
                _loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);
            }
            
            protected 
    function onLoad(event:Event):void {
                
    if(content.numChildren==0){ //这里加上了只有第一次装载时才add到容器中的判断
                    content.addChild(_loader);
    //这里直接添加_loader对象,因为Loader也是从DisplayObject类继承过来的,所以能直接用
                }
                
                _eventDispatcher.dispatchEvent(
    new Event(PhotoLoader.EVENTS_LOAD));
            }


    果然这样直接就可以用,而且不需要每次都去new了。

    为什么会出现这种情况呢?

    我又把代码改回去调试了一下:

                trace(_loader.content.parent);
                content.addChild(_loader.content);
                trace(_loader.content.parent);

    输出:

        [object Loader]

        [object Sprite]


    由此可见,_loader.content的父节点被改变了(废话,因为被addChild到另外的DisplayObject里了),所以可能Loader的load()方法在处理content的时候,用到了content.parent这个对象,结果因为parent被改变了,所以出错了,有研究过as3类库源码的同学可以出来帮忙说明一下下^_^。

    所以之前的代码改为这样既可:


    代码
            public function loadPhoto(picURL):void {
                _loader.load(
    new URLRequest(picURL));
                _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad);
                _loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);
            }
            
            protected 
    function onLoad(event:Event):void {
                
    if(content.numChildren==0){
                    content.addChild(_loader);
                }
                
                _eventDispatcher.dispatchEvent(
    new Event(PhotoLoader.EVENTS_LOAD));
            }


  • 相关阅读:
    什么叫TLD、gTLD、nTLD、ccTLD、iTLD 以及几者之间的关系
    socket
    windows下codeblocks报错undefined reference to `WSAStartup@8'|
    Codeforces 467C George and Job | DP
    51Nod 1049最大子段和 | 模板
    51Nod 最大子矩阵和 | DP
    AtomicInteger
    sun.misc.unsafe
    CAS
    java中的四种引用
  • 原文地址:https://www.cnblogs.com/Random/p/1791657.html
Copyright © 2011-2022 走看看