在模块开发方式下总是会有很多独立的模块,而这些模块都是在需要时运行,不需要时暂停.当然,可以在需要时加载,不需要时卸载掉,如果这些模块的运行和暂停操作很频繁,又或者他们自己还保存了一些有状态的数据(比如size),那么就不能频繁的加载和卸载了,因为会造成内存的增加和cpu的频繁波动.那么可以在第一次加载完成后一直持有这些对象而不卸载,然后调用start和pause方法来实现运行与暂停.
流程
- 写一个接口(ISubSWF)或基类(SubSWFBase).
- 在子swf里应用接口ISubSWF或者继承SubSWFBase.
- 将子swf导出为subSWF.swf.
- MainSWF加载SubSWF.
- 将SubSWF的实例强转为ISubSWF或者SubSWFBase.
- 这样就能对接口或者基类进行操作而不用关心具体是什么类了.
简单代码
接口ISubSWF
package
{
public interface ISubSWF
{
// 开始方法,具体类要实现该方法
function start():void;
// 暂停方法,具体类要实现该方法
function pause():void;
}
}
基类SubSWFBase
package
{
import flash.display.Sprite;
public class SubSWFBase extends Sprite
{
// 开始方法,子类要重写该方法
public function start():void { }
// 暂停方法,子类要重写该方法
public function pause():void { }
}
}
SubSWF类应用接口的实现
package
{
import flash.display.Sprite;
public class SubSWF extends Sprite implements ISubSWF
{
public function start():void
{
trace("the subSWF started!");
}
public function pause():void
{
trace("the subSWF pause!");
}
}
}
MainSWF使用接口的实现
// 说明要加载的子swf的文件路径
var req:URLRequest = new URLRequest("subSwf.swf");
var loader:Loader = new Loader();
// 一定要用loder.contentLoaderInfo添加侦听,不然不会触发COMPLETE事件
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
loader.load(req);
function completeHandler(e:Event):void
{
// 移除侦听,防止内存泄露
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, completeHandler);
// loader.content就是被加载的子swf,现在将它强转为ISubSWF就能对其操作了
var subSWF:ISubSWF = loader.content as ISubSWF;
// 使用接口的方法操作子swf
subSWF.start();
}
结语
这里不讨论具体是继承好还是接口好,总之都有好适用的情况.当然还可以对swf内部的一个任意类(包括非显示类)和库元件绑定的类使用接口或继承,那样再结合外部swc就能完全避免使用反射,当然如果是外部传入的完全限定名就另当别论了.总之没有最好的方式,只有适合自己的方式.
» 转载请注明来源:www.litefeel.com » 《操作子SWF(四)接口或继承》
» 本文链接地址:https://www.litefeel.com/operate-subswf-4/
» 订阅本站:www.litefeel.com/feed/
» Host on Linode VPS
» 本文链接地址:https://www.litefeel.com/operate-subswf-4/
» 订阅本站:www.litefeel.com/feed/
» Host on Linode VPS
This post was last modified on 2019 年 03 月 04 日 00:29