2011-05-11 65 views
0

我使用ModuleManager会加载一个模块,这样的类:的Flex ModuleManager会卸载模块

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

如果我正确地理解了这个问题,听起来好像你在卸载模块时遇到了问题。有一个伟大的Adobe resource,可以帮助你解决这些问题。有几个方面的考虑:

“如果你有一个不卸载模块,来诊断问题的步骤是: 1)确保模块被加载到子级ApplicationDomain(使用默认的负荷参数()方法) 2)使用分析器确保模块中没有对象的引用。“

如果您引用模块中的任何对象,模块将不会卸载。您将要检查以下几个方面使问题没有提及到模块:

  1. 样式
  2. 资源
  3. ExternalInterface.addCallback功能
  4. 及Timer机制
  5. 听众
  6. 焦点
  7. 远程对象
  8. 加载的图像
+1

这是一个确定的可能性,但我也想补充一点,因为您使用的是静态变量并且没有删除事件侦听器,所以您当前拥有的代码已经充满了潜在的问题。 –

+0

嗨,我是初学者。代码不好,我的母语是中文。所以谢谢大家回答。 – Lee

+0

我将修改代码。 – Lee