apache-flex - Spark SkinnableComponent skinDestructionPolicy

标签 apache-flex flex4 skin flex-spark destruction

作为尝试解决我们应用程序内存泄漏的一部分,我们发现对于每个 SkinnableComponentskinDestructionPolicy 都设置为 "never"默认。

这意味着当使用静态皮肤部件时,皮肤将永远保留在内存中。
此外,永远不会触发宿主组件中 partRemoved() 的覆盖。 因此,我们在 partAdded() 覆盖中添加的事件监听器不会被删除,这有效地导致 View 和皮肤保留在内存中。

当进行大量 View 切换时,这是 Not Acceptable 。

这是我们现在如何解决此问题的示例:

public class ViewA extends SkinnableComponent
{
    [SkinPart(required = "true")]
    public var labelA:Label;

    [SkinPart(required = "true")]
    public var buttonA:Button;

    public function ViewA()
    {
        super();
        mx_internal::skinDestructionPolicy = 'auto';
    }

    override protected function getCurrentSkinState():String
    {
        return super.getCurrentSkinState();
    }

    override protected function partAdded(partName:String, instance:Object):void
    {
        super.partAdded(partName, instance);

        trace("ViewA::partAdded " + partName);

        if (instance == buttonA)
        {
            buttonA.addEventListener(MouseEvent.CLICK, buttonClickedHandler);
        }
    }

    override protected function partRemoved(partName:String, instance:Object):void
    {


        trace("ViewA::partRemoved " + partName);

        if (instance == buttonA)
        {
            buttonA.removeEventListener(MouseEvent.CLICK, buttonClickedHandler);
        }

        super.partRemoved(partName, instance);
    }

    override public function stylesInitialized():void
    {
        setStyle("skinClass", ViewASkin);
    }
}

但是,使用 mx::internal 方法来规避这种行为对我来说似乎很奇怪。 关于这方面的文档也很少,所以任何想法都将非常受欢迎。

干杯

最佳答案

根据我对 mx::internal 的使用经验Flex SDK 中的命名空间通常意味着:“您可以使用此功能,如果您知道自己在做什么,我们(Adobe,或 future 的 Apache 社区)不保证此 API 在未来的 Flex 版本中永远不会改变。

所以它的使用没有真正的问题,除非你非常关心向后兼容性。如果你真的想避免使用它,你总是可以实现 skinDestructionPolicy="auto" 的行为。在你的子类中。没有那么多代码要写:

    override public function initialize():void {
        addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
        addEventListener(Event.REMOVED_FROM_STAGE, removedFromStageHandler);

        super.initialize();
    }

    private function addedToStageHandler(event:Event):void {
        if (skin == null) attachSkin();
    }

    private function removedFromStageHandler(event:Event):void {
        detachSkin();
    }

请注意,在 SkinnableComponent 中在 commitProperties() 中附加这两个事件监听器类(或不附加,取决于策略)方法。我把它移到了 initialize()方法,因为我们不需要检查 skinDestructionPolicy 中的更改属性(property)了。

另请注意,如果有人确实设置了mx::internal skinDestructionPolicy,此解决方案可能会导致错误至 "auto"旁边。

关于apache-flex - Spark SkinnableComponent skinDestructionPolicy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8150934/

相关文章:

apache-flex - Windows 上的 Application.application.nativeWindow.activate() 问题

apache-flex - 傻瓜学习 Flex 的路线图

apache-flex - Spark DropDownList 作为 AdvancedDataGrid 中的 itemEditor 的问题

java - 快速 Flex 和 Java 教程

css - 动态字体大小 Flex 4 可在调整窗口/面板大小时调整大小

iphone - 如何制作 iPhone 应用程序 "skinnable"?

apache-flex - 弹性 4 : Build a Group with a background

windows - 土坯空气 : Start native window hidden

java - 如何获取 SWT 小部件的皮肤?