Flex跨域加载Module

原文地址 : http://blog.sina.com.cn/s/blog_5ed17a7301017ql2.html

最近需要做跨平台应用加载,所以不可避免需要检索一些Flash Player安全沙箱的问题,需要注意的地方有以下几点:

1.服务器根目录存放crossdomain.xml(例Tomcat/webapps/ROOT;webservice或者其它服务器需要建空项目,发布Flex应用后使用策略域加载),这个文件的作用很明显,是用来给跨域加载模块时的权限允许文件。

2.搭配跨平台应用最好使用module来开发应用中单个功能块。这样编译后的swf就可以随处加载了(当然,properties/flex modules里面的module参数要选择none,即不为任何程序优化,这样module才可以独立运行)。

3.加载module的方法也要发生改变,远程跨域是无法直接使用moduleloader或者modulemanager直接加载的,需要使用字节流load过来后再加载,代码示例:


<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
	<s:layout>
		<s:VerticalLayout/>
	</s:layout>
	
	<fx:Script>
		<![CDATA[
			protected function button1_clickHandler(event:MouseEvent):void
			{
				var obj:Object = {url : "ModuleTest1.swf"};
				loadRemoteModule(obj);
			}
		]]>
	</fx:Script>
	
	<fx:Declarations>
		<!-- Place non-visual elements (e.g., services, value objects) here -->
	</fx:Declarations>
	
	<fx:Script>
		<![CDATA[
			import mx.controls.Alert;
			import mx.core.IVisualElement;
			import mx.events.ModuleEvent;
			import mx.modules.IModuleInfo;
			import mx.modules.ModuleManager;
			
			private var loader:URLLoader;
			private var moduleInfo:IModuleInfo;
			private var moduleInstance:Object;
			
			private function loadRemoteModule(item:Object):void
			{
				var urlRequest:URLRequest = new URLRequest(item.url);
				loader = new URLLoader();
				loader.dataFormat = URLLoaderDataFormat.BINARY;
				loader.addEventListener(Event.COMPLETE, function urlLoader_loadCompleteHandler(event:Event):void
				{
					var styleModuleBytes:ByteArray = ByteArray(URLLoader(event.target).data);
					moduleInfo = ModuleManager.getModule("");
					moduleInfo.addEventListener(ModuleEvent.READY, onModuleReady);
					moduleInfo.addEventListener(ModuleEvent.ERROR, errorHandler);
					moduleInfo.load(null, null, styleModuleBytes);
				});
				loader.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
				loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, errorHandler);
				loader.load(urlRequest);
			}
			private function onModuleReady(event:ModuleEvent):void
			{
				moduleInstance = event.module.factory.create();
				addElement(moduleInstance as IVisualElement);
			}
			private function errorHandler(event:Event):void
			{
				if(event is ModuleEvent)
				{
					Alert.show((event as ModuleEvent).type + ":" + (event as ModuleEvent).errorText);
				}
			}
			
		]]>
	</fx:Script>
	
	<s:Button click="button1_clickHandler(event)" label="load module test"/>
</s:Application>

你可能感兴趣的:(Module)