8

У меня есть сложная Battle система, которая имеет 1 родительскую активность, а затем несколько дочерних классов, которые получают доступ к статическим переменным BattleActivity, расширяя битву и передавая контекст этим классам.Android - освобождение выделенной памяти AnimationDrawable использует up

Все это работает нормально, однако у меня возникла проблема с выпуском всех моих AnimationDrawables из памяти. В течение битвы может быть в общей сложности 24 DrawableAnimations. Сейчас это нормально, но каждый раз, когда пользователь сталкивается с новым монстром, в память добавляется еще 4 анимационных образа, которые будут медленно, но скорее из-за моего приложения с ошибкой anb Out of Memory.

Поэтому мне действительно нужно найти способ освободить всю память, в которую войдет моя боевая система, как только я выйду. В настоящее время я тестирую Sony Z2, и когда пользователь вступает в битву, mmeory увеличивается с 91mb до 230mb. Мне нужно вернуть это использование памяти до 91 МБ, когда битва заработала. Я добавил очень простой фрагмент кода, чтобы дать вам представление о том, как приложение в настоящее время течет, и что я пытаюсь сделать для освобождения памяти.

public class Battle extends Activity 
{ 
    // I have several AnimationDrawables loaded into memory 
    // These are then assigned the relevent animation to a button swicthing between these animations throughout my battle 
    ImageButton btnChr1; 
    AnimationDrawable cAnimHit1; 
} 

//This is the use of one of those AnimationDrawables 
public class Battle_Chr_Anim extends Battle 
{ 
    protected Context ctx; 
    private ImageButton btnChr1; 
    AnimationDrawable cAnimHit1; 

    public Battle_Chr_Anim(Context c, ImageButton _btnChr1, AnimationDrawable _cAnimHit1) { 
     this.ctx = c; 
     this.btnChr1 = _btnChr1; 
     this.cAnimHit1 = _cAnimHit1; 
    } 

    // Bound the ImageButton 
    int id = ctx.getResources().getIdentifier("idle", "drawable", ctx.getPackageName()); 
    img_chr1.setBackgroundResource(id); 
    frameAnimation = (AnimationDrawable)img_chr1.getBackground(); 
    frameAnimation.start() 

    // Loaded into memory ready so I can swicth them over quickly when user attacks 
    int ca1 = ctx.getResources().getIdentifier("attack", "drawable", ctx.getPackageName()); 
    cAnimHit1 = (AnimationDrawable)chrHit1.getBackground(); 
    cAnimHit1.start(); 
} 

public class Battle_Ended extends Battle 
{ 
    protected Context ctx; 

    public Battle_Ended(Context c) { 
     this.ctx = c; 
    } 

    //This is a dialog popup when the user completes the battle closing the battle activty 
    void EndBattle() 
    { 
     ImageButton btnSubmit = (ImageButton)dialog.findViewById(R.id.imgBtnSubmit); 
     btnSubmit.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent returnIntent = new Intent(); 
       setResult(RESULT_CANCELED, returnIntent); 
       RecyleAllAnimations(); 
       dialog.dismiss(); 
       ((Activity) ctx).finish(); 
      } 
     }); 
    } 

    void RecyleAllAnimations() 
    { 
     // I want all AnimationDrawables from memory here, I believe the below line removes the one currently in use, however I have no way of releasing the other animations sitting in memory. 
     img_chr1.setBackgroundResource(android.R.color.transparent); 
     System.gc(); 
    } 
} 
+0

У вас действительно есть статические переменные, которые вы передаете контексту приложения? я думаю, что они собираются убить вас гораздо раньше, чем ваши drawables – TheRedFox

+0

Да, это только для моей битвы вещей, так как я не хотел, чтобы весь мой код находился в одной и той же Деятельности и просто расширил этот класс, чтобы я мог получить доступ к UI.Поскольку мне нужно иметь возможность загружать все AnimationDrawables до того, как я загружу Activity, чтобы анимации могли быть свободными при входе пользователя в битву. –

ответ

0

первую очередь я думаю, что вы не можете сделать какой-либо переработки для AnimationDrawable, если вы не покинете область, которую они объявлены. не ретранслируйте по System.gc();, и пусть GC автоматически освободит эту память для вас.

, доступ к статическим переменным из BattleActivity

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

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

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

+0

Я внесла поправки в свой код, чтобы я больше не использовал статический AnimationDrawable, однако я все еще проблема с выпуском памяти даже после уничтожения активности, и пользователь вернулся на страницу «Карта игр». Любые другие идеи? –

+0

Какой вопрос у вас сейчас? – mmlooloo

+0

Ну просто положите память не будет выпущена для AnimatonDrawables –

0

Использование статических чертежей (-ов) или представлений (-ов) приведет к утечке памяти, потому что чертежи являются работоспособными.

Вы можете либо проверить для любого другого статического Drawable (ов) или View (ов) и избавиться от них или позвонить

drawable.setCallback(null); 

Вы не можете переработать Drawable объекты, и это не является хорошей практикой для вызова системы .gc()

Кажется, что ваше приложение страдает от утечки памяти где-то, если вы пробовали вышеуказанное, и память все еще расширяется с такой скоростью, тогда подумайте о том, чтобы сделать memory analysis, чтобы сузить проблему.

+0

Я не думаю, что это тот факт, что я страдаю от утечки памяти, я думаю, что это уменьшает объем памяти, пригодный для использования. Я имею в виду, что на одной загрузке у меня есть 30 AnimationDrawable, которые нужно загрузить, каждая из которых состоит из примерно 15 изображений с 256 пикселями x 256 пикселей. Поэтому, как и ожидалось, использование памяти увеличивается (для загрузки на устройство также требуется 2-4 секунды). С этим я могу справиться, однако это делается, мне нужно как-то освободить эту память. Поскольку каждый раз, когда встречается новый монстр, в память добавляются еще 5 AnimationDrawables. –

+0

Это правда, но если ваша активность не просочилась, память должна быть освобождена по мере необходимости, также если вы вызвали System.gc() вручную после закрытия Activity the Drawable (ы) должны быть очищены от памяти, если нет утечки. Что делать, если вы не уверены, что статические Drawable (ы) не используются, а другие вещи, о которых я упоминал, заставляют их указывать на нуль при завершении, чтобы избежать возможной Loitering. –

+0

. Думаю, мне придется посмотреть на эту сегодняшнюю ночь, поскольку вам нужно удалить статическую информацию из всех ImageViews и ImageButtons затем могут проверить его правильно. Каков способ проверки на предмет утечки памяти и анализа памяти? –

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