Flex ModuleManager卸载模块

时间:2011-05-11 13:26:51

标签: flex actionscript-3

我使用ModuleManager加载一个模块,就像这个Class:

 public class LoadModule
    {
        private static var info:IModuleInfo;
        private static var display:IVisualElement;
        private static var downloadBar:ProgressBar;
        private static var parent:Group;


        public function LoadModule()
        {

        }
        //load module
        public static function load(url:String, parent:Group, bar:Boolean = true):void {
            LoadModule.parent = parent;
            info = ModuleManager.getModule(url);
            info.addEventListener(ModuleEvent.READY, readyHandler);
            info.addEventListener(ModuleEvent.SETUP, setupHandler);
            info.addEventListener(ModuleEvent.ERROR, errorHandler);
            info.load(null, null, null, parent.moduleFactory);

        }

        //add display object
        private static function readyHandler(event:ModuleEvent):void {
            LoadModule.display = event.currentTarget.factory.create() as IVisualElement;
            parent.addElement(LoadModule.display);
        }

        private static function setupHandler(event:ModuleEvent):void {

        }
        //unload module
        public static function unload():void {
            if (LoadModule.info != null) {
                LoadModule.info.addEventListener(ModuleEvent.UNLOAD, unloadHandler);
                LoadModule.info.unload();
                if (parent.getElementIndex(LoadModule.display) != -1) {
                    parent.removeAllElements();
                    LoadModule.display = null;
                }
            }
        }

        private static function unloadHandler(event:ModuleEvent):void {
            LoadModule.info.removeEventListener(ModuleEvent.UNLOAD,unloadHandler);
            trace("unloadModue");
        }
        //
        private static function progresshandler(event:ModuleEvent):void {
            downloadBar.label = "haved" + Math.round((event.bytesLoaded /event.bytesTotal) * 100) + "%";
        }

        private static function errorHandler(event:ModuleEvent):void {
            throw Error(event.errorText);
        }

        public static function setDownloadbar(downloadBar:ProgressBar):void {
            LoadModule.downloadBar = downloadBar;
        }
    }

然后我加载一个模块并卸载一个模块:

 LoadModule.unload(); // 1
   LodModule.load('..one.swf', parent);
   LoadModule.unload(); //2
   LodModule.load('...one.swf', parent);

理论上,它只是我应用程序中的一个模块,我使用“PopUpManager”弹出一个框,它应该是一个盒子。但是,事实上,它是流行的拖车箱。 我使用Flash builder调试这段代码,它没有注意到我unloade swf .. 我猜,它有两个应用模块。 所以,我需要帮助。如何在ModuleManager中卸载模块。我希望一个模块在应用中,而不是拖曳。 感谢。

1 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,听起来你在卸载模块时遇到了问题。有一个很棒的Adobe resource可以帮助您解决这些问题。一些注意事项:

  

“如果您有一个无法卸载的模块,诊断问题的步骤是:   1)确保将模块加载到子applicationDomain中(在大多数情况下使用load()方法的默认参数)   2)使用分析器确保模块中没有对象的引用。“

如果引用模块中的任何对象,模块将不会卸载。您需要检查以下区域是否未引用相关模块:

  1. 样式
  2. 资源
  3. ExternalInterface.addCallback函数
  4. 计时器和计时器机制
  5. 监听
  6. 焦点
  7. 远程对象
  8. 已加载图片
相关问题