加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flash – 动态加载SWF会导致先前加载的SWF出现异常

发布时间:2020-12-15 07:23:48 所属栏目:百科 来源:网络整理
导读:我遇到了Flash和Flex的一个非常奇怪的问题.看来在某些情况下,如果在同一时间加载了另一个SWF,则无法在运行时(使用Loader)加载的SWF中的影片剪辑被实例化.以下是重现错误的程序的完整代码.它是使用mxmlc编译的,通过 Ensemble Tofino: package { import flash
我遇到了Flash和Flex的一个非常奇怪的问题.看来在某些情况下,如果在同一时间加载了另一个SWF,则无法在运行时(使用Loader)加载的SWF中的影片剪辑被实例化.以下是重现错误的程序的完整代码.它是使用mxmlc编译的,通过 Ensemble Tofino:

package 
{
    import flash.display.*;
    import flash.events.*;
    import flash.net.*;
    import flash.system.*;

    public class DynamicLoading extends Sprite
    {
        private var testAppDomain:ApplicationDomain;

        public function DynamicLoading()
        {
            var request:URLRequest = new URLRequest("http://localhost/content/test.swf");
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onTestLoadComplete);
            loader.load(request);
        }

        private function onTestLoadComplete(e:Event):void
        {
            var loaderInfo:LoaderInfo = LoaderInfo(e.target);
            testAppDomain = loaderInfo.applicationDomain;

            // To get the error,uncomment these lines...
            //var request:URLRequest = new URLRequest("http://localhost/content/tiny.swf");
            //var loader:Loader = new Loader();
            //loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onTinyLoadComplete);
            //loader.load(request);

            // ...and comment this one:
            onTinyLoadComplete();
        }

        private function onTinyLoadComplete(e:Event = null):void
        {
            var spriteClass:Class = Class(testAppDomain.getDefinition("TopSymbol"));
            var sprite:Sprite = Sprite(new spriteClass());

            sprite.x = sprite.y = 200;

            addChild(sprite);
        }
    }
}

如上所示注释掉第二个加载操作,代码可以工作.但是,如果取消注释第二个加载操作并且在加载第二个SWF后运行onTinyLoadComplete,则包含新spriteClass()的行将失败,并出现以下异常:

TypeError: Error #1034: Type Coercion failed: cannot convert flash.display::MovieClip@2dc8ba1 to SubSymbol.
    at flash.display::Sprite/constructChildren()
    at flash.display::Sprite()
    at flash.display::MovieClip()
    at TopSymbol()
    at DynamicLoading/onTinyLoadComplete()[C:Users...TestFlashDynamicLoading.as:38]

test.swf和tiny.swf是在Flash CS4中创建的. test.swf包含两个符号,两个符号都是为ActionScript导出的,一个名为TopSymbol,另一个名为SubSymbol. SubSymbol包含一个简单的图形(涂鸦),TopSymbol包含一个SubSymbol实例. tiny.swf什么都没包含;它是发布一个新的空ActionScript 3项目的结果.

如果我修改test.swf以便不为ActionScript导出SubSymbol,则错误消失,但在我们的实际项目中,我们需要能够动态加载包含其他导出精灵类作为子节点的精灵类.

关于是什么导致这个或如何解决它的任何想法?

编辑:有几个人建议tiny.swf可能包含一个与test.swf或父类(DynamicLoading.swf)中的类同名的类.它不是.正如我上面所说,我通过简单地发布一个全新的空Flash CS4项目来创建tiny.swf.以下是在tiny.swf上运行时swfdump -D的完整输出:

[HEADER]        File version: 10
[HEADER]        File is zlib compressed. Ratio: 41%
[HEADER]        File size: 1343
[HEADER]        Frame rate: 30.000000
[HEADER]        Frame count: 1
[HEADER]        Movie width: 550.00
[HEADER]        Movie height: 400.00
[045]         4 FILEATTRIBUTES as3 symbolclass
[04d]      1284 METADATA
[009]         3 SETBACKGROUNDCOLOR (ff/ff/ff)
[056]        11 SCENEDESCRIPTION
[001]         0 SHOWFRAME 1 (00:00:00,000)
[000]         0 END

解决方法

我已经看到两个swfs加载时的时髦行为.当两个swfs具有相同类的不同版本时,会出现问题.检查以确保TopSymbol中的SubSymbol实例与您直接加载的SubSymbol相同.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读