• 【设为首页】
  • 【收藏闪客居】
当前位置:主页>FLASH AS 编程>AS基础篇>文章内容
  • Flash 本地运行库探索
  • 来源:三七工作室 作者:三七 2007-11-05 【


    自从AS3推出来之后,研究它已有一段时间了.AS3在本地客户端提供了两个对象:LocalConnection和SharedObject本地共享对 象.利用这两个对象可以弥补客户端浏览器Js的很多不足.而本地共享对象更具独有的性质,对每一个独立域的SWF来说默认都拥有100K的本地共享存储空 间.虽然只有100K但是可以做很多的事情了,例如可以用作跨域Cookie,或是用户参数设置的保存等.当看到这里的时候,不知道有没有人想到,可以将 这100K做成一个在本地加载的运行库? 在这里我们探索一下.

    先解释一下什么叫本地运行库, 如果学过C的人都知道,C有一些库文件,后缀名为.lib,这些库文件里面存储的是已编译好的程序,包抱数据结构和功能函数,它是一个静态的库,当C编译的时候加载这些库里面已编译好的二进制数据结构或函数放到目标的程序中,这样就可以实现代码重用,加快编译速度. 在C++时代,也有类似的库,但更多使用的是后缀名为.dll的库文件,.dll的库文件跟.lib的有根本性的区别. .dll的库文件叫动态库文件, 它是指程序在执行的时候加载这个.dll文件进内存再调用里面的函数,实例它里面的类. 现在我们讨论的就是在AS3中实现类似的.dll这种文件的功能. 在用户客户端浏览器中缓存一些可动态加载并运行的库类. 当然,你也可以将Js字符串放在里面,加载运行. 呵呵,听起来是不是不可思议? 你可千万不要下载一个病毒放在这里面哦,不然我想杀毒 软件都清不了. 呵呵,说笑啦,FlashPlayer的安全沙箱不允许你缓存的这个库跨域读取或执行,所以不用担心这个.

    要实现本地运行库的第一个条件成熟了,就是有地方缓存,有100K供我们使用,如果有的用户设置达1M的空间,那么,你可以缓存更多的东西,不过一般的用户不会设置这么高的. 第二个条件就是如何存取一个库到这个本地共享对象中去, 我们可以采用将swf从服务器端读取出来,然后用二进制的形式写进去, 还好AS3的URLRequest提供了一个读取二进制数据的功能,而Loader也提供了一个将二进制转化为SWF的功能. 这样,本地运行库实现起来就比较简单了.

   下面讲一下我的思路:
    本地运行库的目的是,将一些常用的工具类,或是一些不变的资源文件打包成一个SWF文件,带一个版本号,通过URLRequest加载成功后,缓存在本地,作为一个运行支持的库,里面的类,或是图片资源等,你要的时候就去这个库取出来就可以了.示例代码如下:

ActionScript代码
  1. package {  
  2.     import flash.display.Loader;  
  3.     import flash.display.Sprite;  
  4.     import flash.events.Event;  
  5.     import flash.net.SharedObject;  
  6.     import flash.utils.ByteArray;  
  7.       
  8.     import load.LoadEvent;  
  9.     import load.LoadFileBase;  
  10.     import load.LoadFileData;  
  11.       
  12.     /** 
  13.      * 完成本地共享对象的读取,版本比较,加载,替换等操作. 
  14.      */  
  15.     public class LocalRunLib extends Sprite{  
  16.         public const LOADFAILED:String="load_local_Lib_failed";  
  17.         public const LOADSUCCESS:String="load_local_Lib_success";  
  18.         private var ver:String;  
  19.         public var Lib:*;  
  20.           
  21.         public function LocalRunLib():void{  
  22.             getLib("Lib.swf","0708a01");  
  23.             addEventListener(LOADSUCCESS,testSuccess);  
  24.             addEventListener(LOADFAILED,testFailed);  
  25.         }  
  26.           
  27.         private function testSuccess(event:Event):void{  
  28.             trace(event.target.Lib.applicationDomain.getDefinition("Tt"));  
  29.         }  
  30.           
  31.         private function testFailed(event:Event):void{  
  32.             trace(event.target);  
  33.         }  
  34.           
  35.         /** 
  36.          * 获取运行库. 
  37.          * @param _url  获取本地失败后,向远程加载. 
  38.          * @param ver   当前需要的版本. 
  39.          */  
  40.         private function getLib(_url:String,ver:String):void{             
  41.             var flag:Boolean=false;  
  42.             var share:SharedObject=SharedObject.getLocal("resources");  
  43.             var Obj:Object=share.data;  
  44.             this.ver=ver;         
  45.             if(Obj!=null)  
  46.                 if(Obj.version==ver){  
  47.                     converToLib(Obj.lib);                 
  48.                     flag=true;            
  49.                 }  
  50.             share.close();  
  51.             share=null;           
  52.             if(!flag){  
  53.                 var loadFile:LoadFileBase=new LoadFileBase(new LoadFileData(_url,LoadFileBase._SWF));  
  54.                 loadFile.addEventListener(LoadFileBase.SUCCESS,success);  
  55.                 loadFile.addEventListener(LoadFileBase.FAILED,failed);  
  56.             }  
  57.         }  
  58.           
  59.         /** 
  60.          * 将共享对象变成可运行的库. 
  61.          */  
  62.         private function _onLoaderComplete(event:Event):void{  
  63.             // 下面的Lib大伙可以测试一下,是否是Loader对象了.
  64.             Lib=event.currentTarget;  
  65.             event.target.removeEventListener(Event.COMPLETE, _onLoaderComplete);              
  66.             dispatchEvent(new Event(LOADSUCCESS));  
  67.         }  
  68.           
  69.         /** 
  70.          * 写入到库. 
  71.          */  
  72.         private function writeLocalLib(swf:*,ver:String):*{  
  73.             var share:SharedObject=SharedObject.getLocal("resources");  
  74.             share.data.version=ver;  
  75.             share.data.lib=swf;  
  76.             share.flush();  
  77.             share.close();  
  78.             share=null;  
  79.         }  
  80.           
  81.         /*** 
  82.          * 将二进制内容转化为可运行库. 
  83.          */  
  84.         private function converToLib(data:ByteArray):void{  
  85.             var loader:Loader = new Loader();  
  86.             loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onLoaderComplete);  
  87.             loader.loadBytes(data);  
  88.         }  
  89.           
  90.         /** 
  91.          * 加载指定url的运行库成功. 
  92.          */  
  93.         private function success(event:LoadEvent):void{           
  94.             converToLib(event.loadData.data as ByteArray);  
  95.             writeLocalLib(event.loadData.data,ver);  
  96.             removeEvent(event.target as LoadFileBase);  
  97.         }         
  98.           
  99.         /** 
  100.          * 加载指定url的运行库失败. 
  101.          */  
  102.         private function failed(event:LoadEvent):void{            
  103.             removeEvent(event.target as LoadFileBase);  
  104.             dispatchEvent(new Event(LOADFAILED));  
  105.         }  
  106.           
  107.         /** 
  108.          * 删除事件. 
  109.          */  
  110.         private function removeEvent(loadFile:LoadFileBase):void{  
  111.             loadFile.removeEventListener(LoadFileBase.SUCCESS,success);  
  112.             loadFile.removeEventListener(LoadFileBase.FAILED,failed);  
  113.         }  
  114.     }  
  115. }  



    以上代码只是一个参考,如果你想获得此段代码的话,可以给我发邮件:Wills@37studio.net




上一篇:物理运动学公式汇总   下一篇:从基础开始深入学习Flash AS3 (译文) 1
  • 用户名:新注册) 密码: 匿名评论
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)

Copyright © 2006-2008 flashas.net All Rights Reserved.
网站内容咨询: admin#flashas.net (#为@) 联系QQ:40777822 浙ICP备06033001号
(本网站最佳浏览解析度为1024*768, 建议使用IE 6.0或以上版本浏览器。)