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