·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

[AS3]as3弱引用addEventListener监听

时间:2015-09-14 13:53酷播
之前只是知道尽量用强引用,不要用弱引用,因为弱引用会被垃圾回收. 对于flash.utils.Dictionary倒是没有什么疑问

之前只是知道尽量用强引用,不要用弱引用,因为弱引用会被垃圾回收. 对于flash.utils.Dictionary倒是没有什么疑问.但EventDispatcher.addEventListener就不明白具体是侦听器被回收了,还是侦听者被回收了。
昨天有看了一些文章,又想起这个问题,就想要理解透彻,于是又仔细看了下API文档.

Class-level member functions are not subject to garbage collection, so you can set useWeakReference to true for class-level member functions without subjecting them to garbage collection. If you set useWeakReference to true for a listener that is a nested inner function, the function will be garbge-collected and no longer persistent. If you create references to the inner function (save it in another variable) then it is not garbage-collected and stays persistent.

原来这里的弱引用是对侦听器的(侦听器函数),跟侦听者没有关系. 为了验证这个观点,我做了个小Demo。OK,让我们来一边享受引用,一边学习吧。

  1. package 
  2.     import flash.display.BitmapData; 
  3.     import flash.display.Sprite; 
  4.     import flash.display.StageAlign; 
  5.     import flash.display.StageScaleMode; 
  6.     import flash.events.Event; 
  7.     import flash.events.ProgressEvent; 
  8.     import flash.media.Sound; 
  9.     import flash.net.URLLoader; 
  10.     import flash.net.URLRequest; 
  11.     import flash.system.System; 
  12.     import flash.text.TextField; 
  13.     import flash.utils.Dictionary; 
  14.  
  15.     /** 
  16.      * 弱引用错误用法示例 
  17.      * @author lite3 
  18.      */ 
  19.     [SWF(width=300height=100backgroundColor=0xC7EDCC)] 
  20.     public class WeakReferenceExample extends Sprite  
  21.     { 
  22.         private var weakTxt:TextField; 
  23.         private var strongTxt:TextField; 
  24.         private var sound:Sound = new Sound(); 
  25.         private var arr:Array = []; 
  26.         public function WeakReferenceExample():void  
  27.         { 
  28.             stage.scaleMode = StageScaleMode.NO_SCALE; 
  29.             stage.align = StageAlign.TOP_LEFT; 
  30.             initUI(); 
  31.             sound.load(new URLRequest("http://lite3.googlecode.com/files/WZ_woMenDouShiHaoHaiZi.mp3?" + Math.random())); 
  32.             sound.play(); 
  33.             sound.addEventListener(ProgressEvent.PROGRESS, getHandler(true), false, 0, true); 
  34.             sound.addEventListener(ProgressEvent.PROGRESS, getHandler(false), false, 0, false); 
  35.             sound.addEventListener(Event.COMPLETE, completeHandler); 
  36.  
  37.             // 加快垃圾回收 
  38.             addEventListener(Event.ENTER_FRAME, enterFrameHandler); 
  39.         } 
  40.  
  41.         private function getHandler(isWeak:Boolean):Function 
  42.         { 
  43.             return isWeak ? weakProgressHandler : strongProgressHandler; 
  44.             function weakProgressHandler(e:ProgressEvent):void 
  45.             { 
  46.                 weakTxt.text = "弱引用:加载进度:" + ((e.bytesLoaded / e.bytesTotal * 100) >> 0) + "%"; 
  47.             } 
  48.             function strongProgressHandler(e:ProgressEvent):void 
  49.             { 
  50.                 strongTxt.text = "强引用:加载进度:" + ((e.bytesLoaded / e.bytesTotal * 100) >> 0) + "%"; 
  51.             } 
  52.         } 
  53.  
  54.         private function enterFrameHandler(e:Event):void  
  55.         { 
  56.             if (System.totalMemory >= 500 * 1024 * 1024) 
  57.             { 
  58.                 removeEventListener(Event.ENTER_FRAME, enterFrameHandler); 
  59.             }else 
  60.             { 
  61.                 arr.push(new BitmapData(500, 500, true)); 
  62.             } 
  63.         } 
  64.         private function completeHandler(e:Event):void 
  65.         { 
  66.             removeEventListener(Event.ENTER_FRAME, enterFrameHandler); 
  67.             strongTxt.text = "加载已完成!"
  68.         } 
  69.  
  70.         private function initUI():void 
  71.         { 
  72.             // CuPlayer.com提示:说明文本 
  73.             var txt:TextField = new TextField(); 
  74.             txt.text = "测试弱引用!\nprogressHandler使用若引用.\ncompleteHandler使用强引用."
  75.             txt.width = stage.stageWidth; 
  76.             txttxt.height = txt.textHeight + 4; 
  77.             txt.mouseEnabled = false
  78.             addChild(txt); 
  79.  
  80.             // 弱引用文本 
  81.             weakTxt = new TextField(); 
  82.             weakTxt.width = stage.stageWidth; 
  83.             weakTxt.height = 20
  84.             weakTxt.text = "弱引用:加载进度:0%"
  85.             weakTxt.y = txt.height; 
  86.             addChild(weakTxt); 
  87.  
  88.             // CuPlayer.com提示:强引用文本 
  89.             strongTxt = new TextField(); 
  90.             strongTxt.width = stage.stageWidth; 
  91.             strongTxt.height = 20
  92.             strongTxt.text = "强引用:加载进度:0%"
  93.             strongTxt.y = txt.height + weakTxt.height; 
  94.             addChild(strongTxt); 
  95.         } 
  96.     } 

 

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器