У меня проблемы с утечкой памяти с помощью приложения, которое я создал в 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();
}
Заранее благодарен!
Вам никогда не придется вручную запускать GC, и редко когда-либо вам придется запускать «очистку» в DisplayObject. Просто удалить его из списка отображения и обнулить любые ссылки на него должно быть достаточно. Это похоже на то, что вы утешаете ссылку на ваш взгляд где-то, не позволяя ему очищаться в GC. Вы проверяли на наличие утечек в профилировщике? – drkstr1
У нас также возникает эта проблема при разработке мобильного приложения с использованием Flash Builder. Спасибо за эту тему, я попробую предложение. – andikurnia