辣鸡

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

flash 程序执行是个异步单线程机制,当我们需要让程序等待一会,比如加载资源时要侦听complete,否则容易出现null的情况,由于没有c#中的wait,当遇到需要异步的时候,除了使用事件以外,回调函数也是个不错的选择。


看一段代码:

  1. private function initData ():void {
  2.                 
  3.                         
  4.                         var initNeedData:InitNeedData = new InitNeedData();
  5.                 
  6.                         GetNeedImage.getInstance().getNeedImage("//192.168.168.168\\Images\\8080\\command\\jobs\\123456789.png",getImageComplete );
  7.                         
  8.                 }
  9.                 private function getImageComplete( bit:Bitmap ):void{
  10.                         
  11.                         var tempBitmap:Bitmap = bit;                        
  12.                         this.addChild( tempBitmap );
  13.                 }
复制代码




再看一段代码:


  1.         public function getNeedImage ( imageSource:String,func:Function ):Bitmap {               
  2.                 
  3.                         var crtBitmap:Bitmap;
  4.                         
  5.                         var rc:Resources = new Resources();
  6.                         rc.addEventListener(loadPicOver,loadOverHandler);
  7.                         rc.getResources( imageSource );
  8.                                 
  9.                         function loadOverHandler( event:AssetsEvent ):void{
  10.                                 
  11.                                 var target:Sprite = (event.target) as Sprite;
  12.                                 crtBitmap = event.myEventData as Bitmap;
  13.                                                                         
  14.                                 if ( crtBitmap == null ){
  15.                                         
  16.                                         crtBitmap = new Bitmap( );
  17.                                         
  18.                                         var basicPlane:BasicPlane = new BasicPlane( 222,310,String(1614),114,"1");
  19.                                         var tmpBitmapData:BitmapData = new BitmapData( 222,310 );
  20.                                         
  21.                                         tmpBitmapData.draw( basicPlane );
  22.                                         crtBitmap.bitmapData = tmpBitmapData;
  23.                                 }
  24.                                 target.removeEventListener(loadPicOver,loadOverHandler);
  25.                                 target=null;
  26.                                 func(crtBitmap);
  27.                                 
  28.                         }
  29.                         
  30.                         return crtBitmap;
  31.                 }
复制代码






在以上使用了getImageComplete 这么个回调函数。
那么回调函数实现的原理是什么呢?


使用回调函数实际上就是在调用某个函数时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。来自互联网


好了有些抽象吧,其实回调函数的精髓就是:回调函数就是函数引用(指针)的一种用法


综上所述在代码中


GetNeedImage.getInstance().getNeedImage("//192.168.168.168\\Images\\8080\\command\\jobs\\123456789.png",getImageComplete );


getNeedImage 便持有了getImageComplete 函数的引用(指针),并将其以参数的形式传到getNeedImage这个函数方法自身中,而func(crtBitmap)实际上持有的就是getImageComplete( bit:Bitmap )的引用,简单点就是 他们俩就是一个人,func(crtBitmap)的执行也就是等于执行了

  1. private function getImageComplete( crtBitmap):void{
  2.                         
  3.                         var tempBitmap:Bitmap = crtBitmap;                        
  4.                         this.addChild( tempBitmap );
  5.                 }
复制代码

 

posted on 2013-07-03 20:32  辣鸡  阅读(269)  评论(0编辑  收藏  举报