2013-11-18 4 views
1

У меня проблемы с утечкой памяти с помощью приложения, которое я создал в Adobe Flex, используя Flex Builder. После использования в течение 30-40 минут он начинает замедляться и замедляться.Adobe Flex: утечка памяти при pushView popView

Приложение показывает изображения как каталог, но когда я нажимаю и выворачиваю взгляды, моя память значительно увеличивается.

Я думаю, что если я установил все свои объекты в нуль и уничтожу все используемые битмапды, я мог бы освободить достаточно памяти, чтобы без проблем использовать приложение, но похоже, что проблемы там нет.

У меня есть 3 вида в моем приложении menuView.mxml, categoriesView.mxml и productsView.mxml.

My App начинается в моем компьютере (не в таблетках) с TotalMemory: 47MB и Private Memory: 88 MB

После нажатия и внезапная взгляды на 5 раз я получаю TotalMemory: 61Mb и приватную память: 101 МБ

Представьте, если я сделаю это несколько раз. Приложение начинает идти очень медленно в моем Ipad или моем Galaxy Tab Samsung.

Почему это происходит? Я не знаю, как это решить.

Пожалуйста, помогите! Большое спасибо!!

Я разместил код ниже.

Когда я в menuView я использую следующий код, чтобы подтолкнуть вид из menuView в categoriesView

protected function button3_clickHandler(event:MouseEvent):void 
{ 
    if((FlexGlobals.topLevelApplication.getIdClienteServidorCompraActual()!=null)&& (FlexGlobals.topLevelApplication.getIdClienteServidorCompraA ctual()>0)) 
      { 
       navigator.pushView(categoriesView); 
      } 
} 

Когда я в categoriesView я использую следующий код, чтобы подтолкнуть вид из categoriesView к productsView. В этом представлении у меня есть 3 кнопки для каждой категории.

protected function buttonC1_clickHandler(event:MouseEvent):void 
{ 
      //Categoria general con todos 
      var ab:ArrayCollection = getIdAmbienteServidor(); 
      cleanMemory(); 
      navigator.pushView(productsView, null); 
} 



private function cleanMemory():void 
{ 
    result.splice(0); 
    result = null; 
    System.gc(); 
} 

Когда я в productsView я использую следующий код для вызова (I ИСПОЛЬЗОВАТЬ PUSH ВМЕСТО POP БЛАГОДАРЯ РАЗЛИЧНЫХ ВАРИАНТОВ Я ИМЕЮ) вид из productsView к categoriesView.

protected function button1_clickHandler(event:MouseEvent):void 
{ 
    cleanMemory();    
    navigator.pushView(menuView);   
} 

private function cleanMemory():void 
{ 
    if(image1 != null) 
    { 
     image1.source = ""; 
     if(image1.bitmapData != null) 
     { 
      image1.bitmapData.dispose(); 
     } 
    } 
    if(image2 != null) 
    { 
     image2.source = ""; 

     if(image2.bitmapData != null) 
     { 
      image2.bitmapData.dispose(); 
     } 
    } 

    if(result != null) 
    { 
     result.splice(0); 
     result = null; 
    } 
    if(result1 != null) 
    { 
     result1.splice(0); 
     result1 = null; 
    } 
    if(result2 != null) 
    { 
     result2.splice(0); 
     result2 = null; 
    } 

    dbConnection = null; 
    object1 = null; 
    object2 = null; 
    dataToSave = null; 
    cGreyImageSmallAsset = null; 
    cRedImageSmallAsset.bitmapData.dispose(); 
    cRedImageSmallAsset = null; 
    cOrangeImageAsset.bitmapData.dispose(); 
    cOrangeImageAsset = null; 
    cGreenImageAsset.bitmapData.dispose(); 
    cGreenImageAsset = null; 
    cPinkImageAsset.bitmapData.dispose(); 
    cPinkImageAsset = null; 
    cBlueImageAsset.bitmapData.dispose(); 
    cBlueImageAsset = null; 
    cGreyImageAsset.bitmapData.dispose(); 
    cGreyImageAsset = null; 
    cRedImageAsset.bitmapData.dispose(); 
    cRedImageAsset = null; 
    cGreenImageSmall = null; 
    cOrangeImageSmall = null; 
    cPinkImageSmall = null; 
    cBlueImageSmall = null; 
    cGreyImageSmall = null; 
    cRedImageSmall= null; 
    cGreenImage = null; 
    cPinkImage = null; 
    cBlueImage= null; 
    cGreyImage = null; 
    cRedImage= null; 
    cOrangeImage= null; 
    System.gc(); 
} 

Загружаю изображения.

private function setImages():void 
{    
    if(object1!=null) 
    {     
     panelLeft.visible = true; 
     buttonLeftMore.visible = true; 
     image1.source = "file://" + File.applicationStorageDirectory.nativePath + "/b"+object1.idArchivo+"_500.jpg"; 
     setObject1MainTexts(); 
    } 
    else 
    { 
     image1.source = ""; 
     panelLeft.visible = false; 
     buttonLeftMore.visible = false; 
    } 

    if(object2!=null) 
    { 
     panelRight.visible = true; 
     buttonRightMore.visible = true; 
     image2.source = "file://" + File.applicationStorageDirectory.nativePath + "/b"+object2.idArchivo+"_500.jpg"; 
     setObject2MainTexts(); 
    } 
    else 
    { 
     image2.source = ""; 
     panelRight.visible = false; 
     buttonRightMore.visible = false; 
    } 
    } 

Когда я в categoriesView я использую следующий код для вызова (I ИСПОЛЬЗОВАТЬ PUSH ВМЕСТО POP БЛАГОДАРЯ РАЗЛИЧНЫХ ВАРИАНТОВ Я ИМЕЮ) вид из categoriesView к menuView.

protected function button1_clickHandler(event:MouseEvent):void 
{ 
    cleanMemory(); 
    navigator.pushView(menuPrincipalBelda); 
} 

private function cleanMemory():void 
{ 
    result.splice(0); 
    result = null; 
    System.gc(); 
} 

Заранее благодарен!

+0

Вам никогда не придется вручную запускать GC, и редко когда-либо вам придется запускать «очистку» в DisplayObject. Просто удалить его из списка отображения и обнулить любые ссылки на него должно быть достаточно. Это похоже на то, что вы утешаете ссылку на ваш взгляд где-то, не позволяя ему очищаться в GC. Вы проверяли на наличие утечек в профилировщике? – drkstr1

+0

У нас также возникает эта проблема при разработке мобильного приложения с использованием Flash Builder. Спасибо за эту тему, я попробую предложение. – andikurnia

ответ

0

Помните, что Flex Builder использует виртуальную машину Flash, и это освобождает память, если сочтет это необходимым, даже если вы попытаетесь заставить его очистить сборщик мусора, это не будет сделано, если у вас есть свободная память и вы не считаете это необходимым. Протестируйте фильм встроенный в изображениях, которые вам нужны в приложении, а не на постоянной загрузке. Так как это может позволить некоторым отношениям низкого уровня.

рассматривает

+0

Благодарим вас за ответ matilu. Вы ссылаетесь на встроенные изображения ?, Я использую var, который любит записывать для получения изображений, которые я использую на мой взгляд. Вставить (источник = "../ img/cgreen_small.png")] частный var cGreenImageSmall: класс; [Вставить (источник = "../ img/corange_small.png")] частный var cOrangeImageSmall: класс; частный var cGreenImageSmallAsset: BitmapAsset; private var cOrangeImageSmallAsset: BitmapAsset; – user1809819

+0

Я хочу сказать, что, возможно, вам лучше всего использовать встроенные изображения (зависит от того, сколько вы должны загружать изображения, но среди них, не преодолевайте 300kb, идите для него), поскольку постоянная загрузка файлов может уходить отношения низкой памяти. Также проверьте, что у вас есть фон со стилями, прослушиватель событий на загружаемых изображениях. И это не хороший запуск popUp. Невозможно увидеть подробное приложение. Я не могу дать мне представление о том, что еще может быть. Надеюсь, вы сможете решить эту проблему. приветствует – matilu

+0

Матилу, благодарю вас за ваши комментарии. Я попробую его и дам вам знать, что это помогает. – user1809819

0

Когда я работал с GC, я обнаружил, что это стало преимуществом попробовать несколько различных способов!Я использовал 3 в общей сложности с течением времени, но просто могу найти только один на данный момент, поскольку это было заметно заметно в этом приложении. так что вот оно и, если нужно, я могу отправить двух других, а также просто искать их!

 private var gcCount:int; 

     private function startGCCycle():void { 

      gcCount = 0; 
      addEventListener(Event.ENTER_FRAME, doGC); 
     } 
     private function doGC(evt:Event):void { 

      flash.system.System.gc(); 

      if(++gcCount > 1) { 

       removeEventListener(Event.ENTER_FRAME, doGC); 
       setTimeout(lastGC, 40); 
      } 
     } 
     private function lastGC():void{ 
      flash.system.System.gc(); 
     } 
    ]]> 

Я просто смотрел на что-то еще, что вы должны попробовать, и это сработало для меня очень хорошо!

FlexGlobals.topLevelApplication.deleteReferenceOnParentDocument (this) Я использовал их в makeComplete в MXML, где мне приходилось открывать 45 Main Canvases один за другим, но каждый раз с тремя PopUps = 180, которые легко обрабатывались в том, как я работал GC in! thanks aktell

+0

Спасибо, aktell, я отвечу на ваш комментарий, если у меня возникнут проблемы с GC. – user1809819

+0

Это прекрасно! но я вижу, что вы не используете IF, возможно, и подходите к тому же коду на вашем втором EventListener ??? xeasy.addEventListener (ResultEvent.RESULT, AppWS_resultHandler); Тестировать ! xeasy.addEventListener (ResultEvent.RESULT, AppWS_resultHandler, false, 1); а также использовать ADD в одном & REMOVE в другой функции. рассматривает актелл – aktell

1

Я обнаружил проблему: я не удалял EventListener, теперь работает нормально.

Я оставляю вас, ребята, с некоторыми примерами. Если вы их не удаляете, память увеличивается! Будьте осторожны с этим.

stage.addEventListener("keyUp", handleButtons, false, 1); 
stage.removeEventListener("keyUp",handleButtons,false); 
xeasy.addEventListener(ResultEvent.RESULT, AppWS_resultHandler); 
xeasy.removeEventListener(ResultEvent.RESULT,AppWS_resultHandler, false); 

Спасибо всем!

Смежные вопросы