Android: невозможно уничтожить активность
Я использую следующий код для удаления дочерних элементов в каждой группе представлений:
protected void onDestroy() {
super.onDestroy();
this.liberarMemoria();
}
public void liberarMemoria(){
imagenes.recycleBitmaps();
this.unbindDrawables(findViewById(R.id.RelativeLayout1));
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();
}
}
где представление: R.id.RelativeLayout1 является ListView.
Но при этом я исключаю исключение:
E/AndroidRuntime(582): java.lang.RuntimeException: Unable to destroy activity {...}: java.lang.UnsupportedOperationException: removeAllViews() is not supported in AdapterView
Как я могу это решить?
Ответы
Ответ 1
Ну, журнал ошибок в значительной степени объясняет это: не вызывайте removeAllViews()
на AdapterView
. И ваш код в какой-то точке встречает ViewGroup
, который также является AdapterView
.
Просто исключите этот случай, используя instanceof
проверить или обработать исключение с помощью обертки try
/catch
.
Ответ 2
Убедитесь, что ваша ViewGroup не является экземпляром AdapterView.
Сделайте что-нибудь подобное:
if (!(view instanceof AdapterView<?>))
((ViewGroup) view).removeAllViews();
Итак, в вашем коде:
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
if (!(view instanceof AdapterView<?>))
((ViewGroup) view).removeAllViews();
}
Ответ 3
Удалить эту строку? Или, по крайней мере, проверьте, поддерживается ли операция с помощью try
и catch
.
Кроме того, немного запутанно хотеть сделать это вообще в методе под названием unbindDrawables
, если только это не плохо названный метод (не описывает, что он делает полностью).
Вы вызываете все это в onDestroy
? Если да, можно ли это сделать? У меня создалось впечатление, что система позаботится об этом для вас.
Ответ 4
Не называйте это. UnsupportedOperationException сообщает вам, что этот метод не поддерживается или не работает, поэтому вам придется выполнить задачу по-другому. Я не вижу необходимости в вызове этого, так как сборщик мусора справится с этой задачей. Утилизация растровых изображений должна выполняться вручную, если вам нужно обеспечить ее выполнение.