actionscript-3 – 在actionscript和Flex中的大型应用程序上管理
我在flex 4.5中有一个很大的移动应用程序,使用“大”我的意思是大…
> 50次观看 我从来没有删除过EventListener,现在我正在看flash分析器,而且我有很多内存泄漏… 我正在尝试修复我的代码但是我在理解如何使用事件监听器方面遇到了很多问题…… 我认为如果我使用一些例子而不是描述每一个可能的情况会更容易…… 例1: private function XXX():void { var x:ClassA = new ClassA(); x.addEventListener(CustomEvent.GETA,doSomething); x.addEventListener(CustomEvent2.TESTB,doSomethingElse); } private function doSomething(e:CustomEvent):void{} private function doSomethingElse(e:CustomEvent2):void{} 一个被触发后我是否需要删除两个eventListener? 在addeventlistener中使用weakReference会更好吗? 例2: tile是TileGroup,但它可能是一切…… protected function activate(event:ViewNavigatorEvent):void { tile.removeAllElements(); for (var i:int = 1 ; i < functionCount.length ; i++) { var t:ImageButton = new ImageButton(); t.label = ""; switch (functionCount.getItemAt(i)) { case "Val1": t.addEventListener(MouseEvent.CLICK,function():void{goToAgenda();}); break; case "Val2": t.addEventListener(MouseEvent.CLICK,function():void{goToAdmin();}); break; case "Val3": t.addEventListener(MouseEvent.CLICK,function():void{goToMyStore();}); break; case "Val4": t.addEventListener(MouseEvent.CLICK,function():void{openBI();}); break; } tile.addElement(t); } 单击ImageButton会调用一个执行某些操作的函数,而不是调用navigator.pushView 如果我有一个15000组件的视图,我必须手动删除视图被删除时添加到每个事件的所有eventlistener ??? 编辑 我主要是需要当一个视图从台上撤下做手工每次我想到了一个替代的时间,这样反而删除所有事件侦听器,并创建一个简单的类… 包工具 public class Evt { public static var listaEvt:ArrayCollection = new ArrayCollection(); private var object:* = null; private var event:* = null; private var functio:* = null public function Evt(obj:*,evt:*,funct:Function) { this.object = obj; this.event = evt; this.functio = funct; } public static function addEvt(obj:*,funct:Function):void { var t:Evt = new Evt(obj,evt,funct); listaEvt.addItem(t); } public static function clear():void { var tmpArr:ArrayCollection = new ArrayCollection(); tmpArr.addAll(listaEvt); listaEvt = new ArrayCollection(); for (var i:int = 0 ; i < tmpArr.length ; i++) { var t:Evt = tmpArr.getItemAt(i) as Evt; if (t.object != null && t.event != null && t.functio != null) { if (t.object.hasEventListener(t.event)) t.object.removeEventListener(t.event,t.functio); } } } } } 在我的代码随时我不需要弱引用我调用(也使用匿名函数): // t can be any component with a event associated... var f:Function = function():void{navigator.pushView(FotoGallery,data);}; Evt.addEvt(t,MouseEvent.CLICK,f); t.addEventListener(MouseEvent.CLICK,f); 然后,当我进入一个新视图时,我做了一个简单的Evt.clear(); 解决方法
最终,更大的应用程序可能受益于
Swiz Framework或
Pure MVC等框架,这可以帮助:
>控制/依赖注入的反转 例如,Swiz可以使用元数据标签来调解事件,既可以从显示列表中捕获事件,也可以为源自非UI源的事件注入调度程序. [Dispatcher] public var dispatcher:IEventDispatcher; [EventHandler( event="UserEvent.ADD_USER" )] public function handleAddUserEvent( event:UserEvent ):void { // do stuff } 否则,如上所述,事件侦听器中的弱引用是一个选项: addEventListener(Event.COMPLETE,completeHandler,true); 需要隔离事件处理的视图可以适应从阶段添加和删除的内在生命周期.当显示对象准备好处理来自显示列表的信号时,在addedToStage上添加侦听器,并在显示对象不再需要事件处理时将侦听器配置在removedFromStage上. package { import flash.display.Sprite; import flash.events.Event; public class MyClass extends Sprite { public function MyClass() { super(); addEventListener(Event.ADDED_TO_STAGE,addedToStageHandler); } protected function addedToStageHandler(event:Event):void { removeEventListener(Event.ADDED_TO_STAGE,addedToStageHandler); addEventListener(Event.REMOVED_FROM_STAGE,removedFromStageHandler); /* add event listeners here */ } protected function removedFromStageHandler(event:Event):void { removeEventListener(Event.REMOVED_FROM_STAGE,removedFromStageHandler); addEventListener(Event.ADDED_TO_STAGE,addedToStageHandler); /* remove event listeners here */ } protected function dispose():void { /* any remaining cleanup */ } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |