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 сообщает вам, что этот метод не поддерживается или не работает, поэтому вам придется выполнить задачу по-другому. Я не вижу необходимости в вызове этого, так как сборщик мусора справится с этой задачей. Утилизация растровых изображений должна выполняться вручную, если вам нужно обеспечить ее выполнение.