开发者

Problem with progressEvent Listener

开发者 https://www.devze.com 2023-04-07 08:06 出处:网络
for (i=0; i < _xmlContents.img_array.length; i++) { _loader = new Loader(); _loader.name = \"image\"+i;
for (i=0; i < _xmlContents.img_array.length; i++)
{
        _loader = new Loader();
    _loader.name = "image"+i;       
    _loader.load(new URLRequest(_xmlContents.img_array[i]));
    _loader.contentLoaderInfo.addEventListener(P开发者_运维技巧rogressEvent.PROGRESS, onLoadingAction);
    //Event.COMPLETE listnere
       //error Handler
}
private function onLoadingAction(e:ProgressEvent):void
{
    _preLoader = new Preloader();
    //addChild(_preLoader);
    trace(_loader.name);
}

I want to add preloader for every image in the xml. Now I am getting for last image only. (consider if xml length is 5, it will trace image4 only)

How can I add that?


It is because you have one _loader object. In every loop step you overwrite this loader with new one so previous image stops loading. You should use new loaders for every image:

for (i=0; i < _xmlContents.img_array.length; i++)
{
    // create new loader instance, not use a global one
    var _loader:Loader = new Loader();
    _loader.name = "image"+i; 
    _loader.load(new URLRequest(_xmlContents.img_array[i]));
    _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onLoadingAction);
    //Event.COMPLETE listnere
    //error Handler

    _preLoader = new Preloader();
    //addChild(_preLoader);
}
private function onLoadingAction(e:ProgressEvent):void
{
    // trace(e.bytesLoaded, e.bytesTotal);

}


First of all your event listeners attached to the loader instances before the last one (e.g. loaders 0 to 3) are there. They will still be there for a long long time. Remove them!

ActionScript is a very nice language - use it's power :)

for (i=0; i < img_array.length; i++)
{
    _loader = new Loader();
    _loader.name = "image"+i;
    _loader.load(new URLRequest(img_array[i]));
    _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, 
        function onLoadingAction(e:ProgressEvent):void
        {
            trace((e.target as LoaderInfo).loader.name);
            //Do whatever you want to do here like removing event listener
            if ((e.target as LoaderInfo).bytesLoaded == (e.target as LoaderInfo).bytesTotal)
            {
                (e.target as LoaderInfo).removeEventListener(ProgressEvent.PROGRESS, onLoadingAction);
                trace("Event listener for " + (e.target as LoaderInfo).loader.name + " removed ");
            }

    }, false, i * 1000 /* you can use priority if want to maintain some order in event handling*/);
}

ActionScript provides you with the ability to name inline functions and to have a reference to them. Use this approach when you don't need to keep a reference to some object.

Good luck and have fun!


 for (i=0; i < _xmlContents.img_array.length; i++)
 {
         _loader = new Loader();
    _loader.name = "image"+i;       
    _loader.load(new URLRequest(_xmlContents.img_array[i]));   
    _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,
     onLoadingAction);
        //Event.COMPLETE listnere
            //error Handler
     _preLoader = new Preloader();
_bgBox.addChild(_preLoader);

 }

This way is solves my problem.. But I don't think so, it's a good way.


I dont think the array is necessary and I think you'll be on a better track adding 4 instances of the preloader by calling it from Event.INIT as opposed to repeatedly adding it by using ProgressEvent.PROGRESS.


You your _loader object is defined inside the function and not referenced anywhere else, so it is garbage collected after the function ends. Create an array of loaders and push the loaders to them each time.

private var _loadersArray:Array=[]; //outside the function

for (i=0; i < _xmlContents.img_array.length; i++)
{
    // create new loader instance, not use a global one
    var _loader:Loader = new Loader();
    _loader.name = "image"+i; 
    _loader.load(new URLRequest(_xmlContents.img_array[i]));
    _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onLoadingAction);
    _loadersArray.push(_loader);
    //Event.COMPLETE listnere
    //error Handler
}
private function onLoadingAction(e:ProgressEvent):void
{
    _preLoader = new Preloader();
    //addChild(_preLoader);
    // get current loader instance
    var _loader:Loader = e.target.loader;
    trace(_loader.name);
}
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号