flash 程序执行是个异步单线程机制,当我们需要让程序等待一会,比如加载资源时要侦听complete,否则容易出现null的情况,由于没有c#中的wait,当遇到需要异步的时候,除了使用事件以外,回调函数也是个不错的选择。
看一段代码:
- private function initData ():void {
-
-
- var initNeedData:InitNeedData = new InitNeedData();
-
- GetNeedImage.getInstance().getNeedImage("//192.168.168.168\Images\8080\command\jobs\123456789.png",getImageComplete );
-
- }
- private function getImageComplete( bit:Bitmap ):void{
-
- var tempBitmap:Bitmap = bit;
- this.addChild( tempBitmap );
- }
复制代码
再看一段代码:
- public function getNeedImage ( imageSource:String,func:Function ):Bitmap {
-
- var crtBitmap:Bitmap;
-
- var rc:Resources = new Resources();
- rc.addEventListener(loadPicOver,loadOverHandler);
- rc.getResources( imageSource );
-
- function loadOverHandler( event:AssetsEvent ):void{
-
- var target:Sprite = (event.target) as Sprite;
- crtBitmap = event.myEventData as Bitmap;
-
- if ( crtBitmap == null ){
-
- crtBitmap = new Bitmap( );
-
- var basicPlane:BasicPlane = new BasicPlane( 222,310,String(1614),114,"1");
- var tmpBitmapData:BitmapData = new BitmapData( 222,310 );
-
- tmpBitmapData.draw( basicPlane );
- crtBitmap.bitmapData = tmpBitmapData;
- }
- target.removeEventListener(loadPicOver,loadOverHandler);
- target=null;
- func(crtBitmap);
-
- }
-
- return crtBitmap;
- }
复制代码
在以上使用了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)的执行也就是等于执行了
- private function getImageComplete( crtBitmap):void{
-
- var tempBitmap:Bitmap = crtBitmap;
- this.addChild( tempBitmap );
- }
复制代码