这是很典型初始化时间差的问题
于是进一步添加编译参数 -keep-generated-actionscript=true 测试
观察 Flex 生成的中间 ActionScript 程序码
Flex Embed 示范 Main.mxml:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
[Embed(source="../assets/assets.swf")]
public var swf:Class;
[Embed(source="../assets/assets.swf", symbol="MC")]
public var mc:Class;
]]>
</mx:Script>
</mx:Application>
将上述的示范添加 -keep-generated-actionscript=true 参数编译之后
可以在生成的 ActionScript 文件中查找三个与 Embed 动作相关的 AS Class
Main_mc.as、Main_swf.as、Main_swf_dataClass.as
Main_mc.as:
package {
import mx.core.SpriteAsset;
[ExcludeClass]
[Embed(_resolvedSource="D:/Workspaces/WorkspaceFlex30/Flex3Test06/assets/assets.swf",
_column="5", symbol="MC", source="../assets/assets.swf", _line="108", _pathsep="true",
_file="D:/Workspaces/WorkspaceFlex30/Flex3Test06/src/generated/Main-generated.as")]
public class Main_mc extends mx.core.SpriteAsset {
public function Main_mc() {
super();
}
}
}
Main_swf.as:
package {
import mx.core.MovieClipLoaderAsset;
import flash.utils.ByteArray;
public class Main_swf extends MovieClipLoaderAsset {
public function Main_swf() {
super();
initialWidth=6000/20;
initialHeight=4000/20;
}
private static var bytes:ByteArray = null;
override public function get movieClipData():ByteArray {
if (bytes == null) {
bytes = ByteArray( new dataClass() );
}
return bytes;
}
[Embed(_resolvedSource='D:/Workspaces/WorkspaceFlex30/Flex3Test06/assets/assets.swf',
mimeType='application/octet-stream')]
public var dataClass:Class;
}
}
Main_swf_dataClass.as:
package {
import mx.core.ByteArrayAsset;
[ExcludeClass]
[Embed(_resolvedSource="D:/Workspaces/WorkspaceFlex30/Flex3Test06/assets/assets.swf",
_column="3", exportSymbol="Main_swf_dataClass", _line="25", _file="Main_swf.as",
mimeType="application/octet-stream")]
public class Main_swf_dataClass extends mx.core.ByteArrayAsset {
public function Main_swf_dataClass() {
super();
}
}
}
由生成的程序码来看,直接 Embed Symbol 并无特别之处
可是 Embed SWF 文件,就不太一样了
Flex 编译器会自动将整个 SWF 文件以 Binary 方式嵌入
运行期使用的时候,最终也是透过 Loader.loadBytes 方式还原
这样的话,一定会有时间差
无法在刚 new 完之后立刻取用
除了上述的问题以外
透过 Loader.loadBytes 生成的实体
还有一些安全性的限制
此外,嵌入整个 SWF 也会增加无谓的文件容量
所以最好还是不要将整个 SWF 嵌入比较好
最后补充一点,嵌入整个 SWF 会保留 ActionScript
而嵌入 Symbol 的 ActionScript 不会保留