1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

ActionScript Garbage Collect problem

Discussão em 'Web Development' iniciada por eralha, 4 de Março de 2009. (Respostas: 5; Visualizações: 583)

  1. eralha

    eralha Power Member

    Boas pessoal, estou com um problema no garbage collecting de uma aplicação que fiz, basicamente o que esta aplicação faz é carregar imagens em slid show, o que sucede e que o uso de memória nao para de subir levando mesmo ao esgotamento de recursos, posto em baixo o exemplo do codigo que tenho resumido, apenas tenho o loader e mesmo fazendo o unload do recurso, a memória nao fica livre.

    Código:
    package ui{
        
        import flash.display.*;
        import flash.events.*;
        import flash.net.URLRequest;
        import flash.text.TextField;
        import ui.XmlPhraser;
        import ui.squareTransition;
        import caurina.transitions.Tweener;
        import flash.utils.Timer;
        import flash.events.TimerEvent;
    
        
        public class homePageEngine extends MovieClip{
            
            private var images:Array = new Array();
            private var imageIndex:Number = 0;
            private var imageLoader:Loader;
            private var xmlDataReader:XmlPhraser = new XmlPhraser();
            private var imageReference:MovieClip;
            private var transition:squareTransition;
            private var stagesArray:Array = new Array();
            private var Timmer:Timer = new Timer(6000);
            private var temporaryData:*;
            private var image:Bitmap;
            private var container:MovieClip;
            private var imageContainer:MovieClip;
            public static var DATA_LOAD_COMPLETE:String = "dataLoad";
            
            public function homePageEngine():void{
                
                Timmer.addEventListener("timer", timerHandler);
                xmlDataReader.addEventListener(DATA_LOAD_COMPLETE, startAPI);
                xmlDataReader.xmlFile = "galeria.xml";
                xmlDataReader.loadData();
                
            }
            
            private function startAPI(e:Event=null):void{
                if(images.length == 0){images = xmlDataReader.imageList;}
                if(imageLoader!=null){
                    try {
                    imageLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, imageLoadComplete);
                    imageLoader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, imageIoErrorHandler);
                    imageLoader.close()
                    imageLoader = null
                        } catch (e:Error) {
                            trace(e);
                        }
                }
                imageLoader = new Loader();
                imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoadComplete);
                imageLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, imageIoErrorHandler);
                imageLoader.load(new URLRequest(images[imageIndex]));
            }
            
            private function imageLoadComplete(e:Event):void{
                imageIndex ++;
                if(imageIndex >= images.length){imageIndex = 0;}
                if(image != null){
                    image = null;
                    container = null;
                    imageContainer = null;
                }
                st.text = String(imageIndex);
                imageLoader.unload();
                Timmer.start();
            }
            
            private function imageIoErrorHandler(e:Event):void{
                
            }
            
            public function timerHandler(event:TimerEvent):void {
                //trace("timerHandler: " + event);
                Timmer.stop();
                try{
                    
                    startAPI();
                }catch(e:Error){
                    trace(e.toString());
                }
            }
    
        }
    }
    
     
  2. eralha

    eralha Power Member

    Problema resolvido, obrigado pela ajuda construtiva.....
     
  3. jatbas

    jatbas Power Member

    Já agora partilha a tua solução se faz favor, fica um exemplo para quem precisa ;)
     
  4. eralha

    eralha Power Member

    Simples, o codigo que postei nao tem problema nenhum, levei foi algum tempo a perceber o funcionamento do GC do flash player. o que via era a memória a incrementar o que me levava a penssar que nao estava a ser feito o GC correctamente, com um pouco de paciencia, reparei que quando atingia um determindao valor de utilização de memória o GC actuava limpando a mem até aos valores iniciais. o GC do flash apenas elemina objectos que tenham 0 referencias associadas.
     
  5. AliFromCairo

    AliFromCairo Power Member

    Podes sempre forçar a actuação do GC, embora raramente seja uma boa ideia.
     
  6. eralha

    eralha Power Member

    podes com: System.gc(); (o que so funciona com debug mode) ou com um pequeno truque dito por grant skiner....que nao acho que seja necessário.
     

Partilhar esta Página