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

actionscript-3 – 在actionscript和Flex中的大型应用程序上管理

发布时间:2020-12-15 01:45:14 所属栏目:百科 来源:网络整理
导读:我在flex 4.5中有一个很大的移动应用程序,使用“大”我的意思是大… 50次观看 50个自定义组件 10个自定义事件 50个自定义类(不是UIComponents) 很多皮肤等…… 我从来没有删除过EventListener,现在我正在看flash分析器,而且我有很多内存泄漏… 事实上,我认为
我在flex 4.5中有一个很大的移动应用程序,使用“大”我的意思是大…

> 50次观看
> 50个自定义组件
> 10个自定义事件
> 50个自定义类(不是UIComponents)
>很多皮肤等……

我从来没有删除过EventListener,现在我正在看flash分析器,而且我有很多内存泄漏…
事实上,我认为使用navigator.pushView或navigator.popView()或navigator.popToFirstView()将除去视图本身所有的对象/变量的任何参考文献与garbaged收集..

我正在尝试修复我的代码但是我在理解如何使用事件监听器方面遇到了很多问题……

我认为如果我使用一些例子而不是描述每一个可能的情况会更容易……

例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?
如果是的话,我是否需要在doSomething和doSomethingElse中删除这两个事件监听器?

在addeventlistener中使用weakReference会更好吗?
x.addEventListener(CustomEvent.GETA,doSomething,false,true);

例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
如果我更改视图,是否应该从每个按钮中删除每个EventListener?
哪个地方最好?

如果我有一个15000组件的视图,我必须手动删除视图被删除时添加到每个事件的所有eventlistener ???

编辑

我主要是需要当一个视图从台上撤下做手工每次我想到了一个替代的时间,这样反而删除所有事件侦听器,并创建一个简单的类…

包工具
{
????import mx.collections.ArrayCollection;

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 */
        }

    }
}

(编辑:李大同)

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

    推荐文章
      热点阅读