2012-01-12 2 views
2

У меня есть совершенно настраиваемый диалог для моего приложения (включая заголовок, кнопки и т. Д.). Я достиг этого, расширяя класс Dialog, и он отображается и работает правильно, но он пропускает всю память, которую он потребляет при создании.Проблемы с памятью с настраиваемыми диалогими

Это ядро ​​его:

public class MyDialog extends Dialog { 
    public MyDialog(Context context, String title) { 
     super(context, R.style.MyDialog); 
     setContentView(R.layout.my_dialog); 
    } 
} 

и создать экземпляр этого таким образом, в пределах Activty:

MyDialog dialog = new MyDialog(this); 
dialog.show 

Это действительно странно, что вы должны передать ссылку деятельности, а не Контекст, когда это является чем-то сильно нецелесообразным, согласно инженерам андроида:

http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html

Я пытался отвязать обратные вызовы диалогового зрения, до начала System.gc(), таким образом:

private void unbindDrawables(View view) { 
    if (view.getBackground() != null) { 
     view.getBackground().setCallback(null); 
    } 
    if (view instanceof ViewGroup) { 
     for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { 
      unbindDrawables(((ViewGroup) view).getChildAt(i)); 
     } 
     ((ViewGroup) view).removeAllViews(); 
    } 
} 


... 

unbindDrawables(dialog.findViewById(R.id.dialog_container)); 

Это имеет какой-то эффект, некоторая память освобождается, но не все.

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

Я что-то упустил? Я совершаю ужасную ошибку? или это что-то обычное на Android?

ответ

0

Попробуйте вызвать метод recycle() в методе unbindDrawables.

И почему бы вам не передать контекст приложения вместо активности в конструктор MyDialog? Таким образом:

MyDialog dialog = new MyDialog(getApplicationContext()); 
+0

Я посмотрю, что происходит с рециркуляцией, спасибо. О контексте приложения, это просто странно. Если вы передаете контекст приложения при создании диалогового окна, вы получаете исключение: ERROR/AndroidRuntime (26833): вызвано: android.view.WindowManager $ BadTokenException: не удается добавить окно - токен null не для приложения У вас есть чтобы передать ссылку на деятельность, чтобы сделать работу Dialog, и, более того, она не документирована, Android API ничего не говорит. http://developer.android.com/reference/android/app/Dialog.html#Dialog(android.content.Context) –

+0

О да, извините, это старая ошибка. Тогда убедитесь, что вы не сохраняете ссылки на активность, переданную конструктору. –

+0

recycle() не работает, и я не сохраняю никаких ссылок на действия в моем классе MyDialog. В любом случае ссылка на действие сохраняется в классе Dialog, посмотрите на его код: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1 /android/app/Dialog.java#Dialog, поэтому, в конце концов, я думаю, что для этой проблемы нет решения. Диалоги в Android подходят только с использованием собственного пользовательского интерфейса, поскольку он потребляет мало памяти. В любом случае, вы можете самостоятельно создавать свои собственные диалоги, но разочаровывает. Спасибо –

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