我一直在使用加载器将很多上传图片上传到我的movieclip中。但我知道如何做的唯一方法是加载内容,添加一个事件监听器,等待它完成处理程序中的作业,使用对这样的加载器的引用。
protected function loadImage(imageDir:String):void
{
loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.INIT,tilesLoadInit);
loader.load(new URLRequest(imageDir));
}
private function tilesLoadInit e:Event):void {
sprite = Bitmap(loader.content).bitmapData;
//load in xml file for map
xmlToArray();
}
我想用我的代码更轻松一点。我宁愿在方法中调用我的loader:Loader类本地而不是在我的类中引用。有没有办法在我的处理程序的Event.INIT参数中检索该加载器对象?
与Sprites相同。假设我创建了一个按钮。用户点击它并调用处理程序。无论如何我可以检索该按钮,通过Event参数将其从舞台中删除,而不是创建Class引用来删除它们。
我想这样做,以便更容易收集垃圾。所以不要创建所有对象的类引用。我宁愿在本地调用它们,所以当我从舞台上删除它们时,垃圾收集器会处理它们。
答案 0 :(得分:1)
您可以在事件侦听器中使用event.currentTarget
来获取对注册事件侦听器的对象的引用。
private function localFunc():void
{
var btn:Button = new Button();
btn.addEventListener(MouseEvent.CLICK, onClick);
}
private function onClick(e:MouseEvent):void
{
//e.currentTarget is typed as Object: in order to assign it to a
//variable of type Button, you must cast it accordingly.
var btn:Button = Button(e.currentTarget);
}
如果是加载程序事件,currentTarget
将是关联的LoaderInfo
对象。 LoaderInfo具有loader
属性,指向原始Loader
对象。
private function tilesLoadInit(e:Event):void
{
var linfo:LoaderInfo = LoaderInfo(e.target);
var ldr:Loader = linfo.loader;//this is the Loader you wanted
}
target
和currentTarget
属性在LoaderInfo事件中是相同的,但在按钮和其他显示对象中可以不同。例如,当您将click事件侦听器添加到按钮并单击作为按钮子项的文本字段时,event.target
将是文本字段,event.currentTarget
将是按钮。基本上,target
将包含触发事件的确切对象,currentTarget
将是当前正在执行的事件侦听器所注册的对象。
对于垃圾收集,您必须先从相应的对象中删除事件侦听器,然后垃圾收集器才能将其扫除。或者,您可以在添加事件侦听器时使用弱引用,方法是在addEventListener方法中设置第五个参数true
。在检查对象是否符合垃圾回收条件时,垃圾收集器不计算弱引用。
但是如果你对局部变量使用弱引用,那么一旦它超出范围(即方法返回时),该对象可能会得到GC,如果它没有任何对它的引用,并且根本不会调用事件监听器:这不是按钮的问题,因为在返回之前将它们添加到显示列表中,从而创建对它的强引用。
使用Event.COMPLETE
代替Event.INIT
来阅读内容。来自livedocs:
complete
- 在文件加载完成后由关联的LoaderInfo
对象调度。
init
- 当可以访问加载的SWF文件的属性和方法时,由关联的LoaderInfo
对象调度。init
事件始终位于complete
事件之前。