最近准备拿flex做个项目练练手,初步设定需求是个视频聊天软件,通信视频服务选用red5,远程录屏选用java开源项目,前端使用flex。在开发过程中,碰到一些小问题,通过博客记录下来,方便以后回顾。
客户聊天功能我使用了两种方式进行数据传输,客户端都监听shareobject对象,还有一种是客服端call服务器的方法,通过服务器invoke通知。这中间模块建立的模块有点多,感觉挺乱的,所以采用动态模块加载。
网上查了一下,看到模块加载,有两种方式,一种是ModuleLoader,另一种是使用ModuleManager。网上说ModuleLoader比ModuleManager简单,实际使用下来,其实差不多,如果都写一样功能的话。项目里面我选用ModuleManager,一次可以载入多个模块,并且对加载的每个过程都可以监听,很不错。
ModuleLoader使用很简单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | <?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" > <fx:Script> <![CDATA[ import mx.modules.ModuleLoader; import mx.controls.Alert; protected function btnModelLoad_clickHandler(event:MouseEvent): void { var url: String = modelLoad.url; if ( url != null && url!= "" ) {modelLoad.unloadModule();} modelLoad.url= "Modules/m1.swf" ; modelLoad.loadModule(); } protected function btnModelUnLoad_clickHandler(event:MouseEvent): void { // TODO Auto-generated method stub modelLoad.url= "" ; modelLoad.unloadModule(); } ]]> </fx:Script> <fx:Declarations> <!-- 将非可视元素(例如服务、值对象)放在此处 --> </fx:Declarations> <s:Button id= "btnModelLoad" x= "693" y= "531" label = "加载模块" click= "btnModelLoad_clickHandler(event)" > </s:Button> <s:Button id= "btnModelUnLoad" x= "693" y= "473" label = "卸载模块" click= "btnModelUnLoad_clickHandler(event)" > </s:Button> <s:ModuleLoader id= "modelLoad" > </s:ModuleLoader> </s:Application> |
ModuleManager使用也不难。
1 <?xml version="1.0" encoding="utf-8"?>
2 <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
3 xmlns:s="library://ns.adobe.com/flex/spark"
4 xmlns:mx="library://ns.adobe.com/flex/mx"
5 minWidth="955" minHeight="600">
6 <fx:Declarations>
7 <!-- 将非可视元素(例如服务、值对象)放在此处 -->
8 </fx:Declarations>
9
10 <fx:Script>
11 <![CDATA[
12 import mx.events.FlexEvent;
13 import mx.modules.IModuleInfo;
14 import mx.modules.ModuleManager;
15 import mx.core.IVisualElement;
16 import mx.events.ModuleEvent;
17 import mx.controls.Alert;
18 import mx.modules.Module;
19 private var module:IModuleInfo;
20 public var sm:Object;
21 public var result:String;
22 protected function btnLoad_clickHandler(event:MouseEvent):void
23 {
24 // TODO Auto-generated method stub
25 module = ModuleManager.getModule("Modules/m1.swf");
26 module.load();
27 module.addEventListener( ModuleEvent.READY,moduleLoadHandler );
28 module.addEventListener( ModuleEvent.PROGRESS,onModuleProgress);
29 module.addEventListener( ModuleEvent.UNLOAD,ModuleUnLoad);
30 module.addEventListener( ModuleEvent.ERROR,ModuleError);
31 }
32
33 private function moduleLoadHandler(event:ModuleEvent ):void
34 {
35 sm = module.factory.create();
36 bContent.addElement( sm as IVisualElement);
37 }
38
39 protected function onModuleProgress (e:ModuleEvent) : void {
40 lb.text = "[MyFlexHero]:ModuleEvent.PROGRESS 当前已经加载了: " + e.bytesLoaded + " of " + e.bytesTotal + " loaded.";
41 }
42
43 private function ModuleUnLoad(event:ModuleEvent ):void
44 {
45 Alert.show("加载取消");
46 }
47
48 private function ModuleError(event:ModuleEvent ):void
49 {
50 Alert.show("加载错误");
51 }
52
53 protected function btnUnLoad_clickHandler(event:MouseEvent):void
54 {
55 // TODO Auto-generated method stub
56 module.unload();
57 bContent.removeAllElements();
58 }
59
60 ]]>
61 </fx:Script>
62
63 <s:BorderContainer id="bContent" width="602" height="310">
64
65 </s:BorderContainer>
66 <s:Button id="btnLoad" x="99" y="366" label="加载模块" click="btnLoad_clickHandler(event)"/>
67 <s:Label x="346" y="366" width="463" height="140" id="lb" text="标签"/>
68 <s:Button x="196" y="366" label="卸载模块" id="btnUnLoad" click="btnUnLoad_clickHandler(event)"/>
69 </s:Application>
目前第一步只是简单使用这些控件,接下来在项目开发的过程中,需要继续深入学习。
作者:编程趋势
出处:http://www.cnblogs.com/codetrend/
作者微博:http://weibo.com/liuxue9527
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库