Android: невозможно уничтожить активность - PullRequest
10 голосов
/ 06 декабря 2011

Я использую следующий код для удаления дочерних элементов в каждой группе:

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.

Но для этого у меня есть enисключение:

E/AndroidRuntime(582): java.lang.RuntimeException: Unable to destroy activity {...}: java.lang.UnsupportedOperationException: removeAllViews() is not supported in AdapterView

Как я могу решить эту проблему?

Ответы [ 4 ]

11 голосов
/ 06 декабря 2011

Ну, журнал ошибок в значительной степени объясняет это: не вызывайте removeAllViews() на AdapterView.И ваш код в какой-то момент встречает ViewGroup, который также равен AdapterView.

Просто исключите этот случай, используя instanceof, проверьте или обработайте исключение с помощью try / catch.

7 голосов
/ 24 января 2013

Убедитесь, что ваша 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();
}
0 голосов
/ 06 декабря 2011

Не называй это.UnsupportedOperationException говорит вам, что этот метод не поддерживается или не работает, поэтому вам придется выполнить задачу другим способом.Я не вижу необходимости вызывать это так или иначе, поскольку сборщик мусора справится с этой задачей.Повторное использование растрового изображения должно выполняться вручную, если вам необходимо убедиться, что оно выполняется.

0 голосов
/ 06 декабря 2011

Удалить эту строку? Или хотя бы проверьте, поддерживается ли операция с try и catch.

Кроме того, немного сбивает с толку желание делать это вообще в методе, называемом unbindDrawables, если только это не метод с плохим именем (не описывается, что он делает полностью).

Вы называете все это в onDestroy? Если так, есть ли польза от этого? У меня сложилось впечатление, что система позаботится о таких вещах для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...