Как очистить динамически создаваемый вид из памяти? - PullRequest
6 голосов
/ 30 марта 2012

Я пытаюсь очистить некоторые виды из памяти.

Вот ситуация.У меня есть действие, которое я назову «А», а другое «Б».

Теперь я нажимаю кнопку в «Деятельности А», которая вызывает «Деятельность Б», которая динамически создает множество просмотров. После этого я нажимаю кнопку «Назад», чтобы вернуться кУпражнение A Повторяйте эти 2 шага много раз.

В результате в DDMS увеличивается количество объектов и памяти. Выделенные кадры растут (количество объектов увеличивается на 88, а количество выделяется на 0,002 МБ).виды не могут быть удалены из памяти!

Как я могу полностью очистить виды из памяти?

Thx!

Обновление - здесь вы получите новую информацию

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

Я попытался решить эту проблему с помощью кода ниже

@Override
protected void onDestroy() {
    super.onDestroy();      
    nullViewDrawablesRecursive(mRootView);
    mRootView = null;
    System.gc();
}

и это мой nullViewDrawablesRecursive

private void nullViewDrawablesRecursive(View view) {
    if (view != null) {
        try {
            ViewGroup viewGroup = (ViewGroup) view;


            int childCount = viewGroup.getChildCount();
            for (int index = 0; index < childCount; index++) {
                View child = viewGroup.getChildAt(index);
                nullViewDrawablesRecursive(child);
            }
        } catch (Exception e) {
        }

        nullViewDrawable(view);
    }
}

И это мой nullViewDrawable

private void nullViewDrawable(View view) {
    try {
        view.setBackgroundDrawable(null);
    } catch (Exception e) {
    }

    try {
        ImageView imageView = (ImageView) view;
        imageView.setImageDrawable(null);
        imageView.setBackgroundDrawable(null);
    } catch (Exception e) {
    }
}

В основном я пытаюсь удалить все представления и дочерние элементы из их родителя (mRootView) перед уничтожением действия,Это работает довольно хорошо, если я этого не сделаю, объекты и использование памяти будут увеличиваться все больше и больше.

Дело в том, что он не идеален, по-видимому, некоторые типы представлений не разрушаются.И я думаю, что я "заново изобретаю колесо", мне кажется, чертовски сложно из-за простой вещи!

Опять же, большое спасибо за попытку помочь мне!

Ответы [ 2 ]

2 голосов
/ 30 марта 2012

Как правило, вам не нужно беспокоиться об удалении просмотров из памяти.Вы бы позволили виртуальной машине и платформе Android справиться с этим, когда это необходимо.Тем не менее, вы должны быть обеспокоены утечками памяти.Если ваши действия разделяют / держат ссылки на представления, и они не могут быть собраны сборщиком мусора, то это проблема.Вы можете начать с этого:не видя ваш код, хотя ...

1 голос
/ 30 марта 2012

В onDestroy () установите представления в null и вызовите сборщик мусора.

@Override
public void onDestroy() {
    super.onDestroy();
    myView = null;
    System.gc();
}

Это может помочь сборщику мусора, вызвав System.gc (), но не гарантируется, что памятьочищено.Однако до тех пор, пока у вас нет утечки, проблем не должно быть.

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