Управление ресурсами Drawables в Android - PullRequest
0 голосов
/ 12 февраля 2012

У меня есть один вопрос.Я сделал быстрый поиск по сайту, но не нашел ответа.Разрабатываем приложение под управлением Android 2.2 и выше.Для настройки представлений мы используем множество элементов рисования, которые используются таким образом:

<LinearLayout ...
    android:background="@drawable/some_drawable"/>

Мы также используем карты и манипулируем многими данными в памяти, и наше приложение стало тяжелым.На лучших устройствах это работает замечательно, но на других мы получили исключение OutOfMemory после нескольких минут использования нашего приложения.Это выглядит как у нас утечки памяти.Я пытаюсь уменьшить использование памяти нашего приложения.вопрос, нужны ли нам ручные ресурсы для очистки при уничтожении нашей деятельности: удаляет рисованные объекты для просмотра или система сделала это для нас?

1 Ответ

3 голосов
/ 12 февраля 2012

Я также столкнулся с этой проблемой в своем приложении. OutOfMemoryError будет выброшено, если в действии используется много растровых изображений с масштабированием и / или другими манипуляциями с растровыми изображениями. Что я сделал, так это добавил следующий код в свою деятельность, что, похоже, делает проблему менее частой (она не решила ее навсегда), и теперь приложение работает без ошибок на недорогом телефоне.

@Override
protected void onDestroy()
{
    super.onDestroy();
    // explicitly release media player
    if(viewObjectInfo != null)
        viewObjectInfo.releaseMediaPlayer();
    //explicitly release all drawables and call GC
    unbindDrawables(findViewById(R.id.main));
    System.gc();
}

/**
 * Unbinds all drawables in a given view (and its child tree).
 * 
 * @param findViewById     Root view of the tree to unbind
 */
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));
        }
        try
        {
            ((ViewGroup) view).removeAllViews();
        }
        catch(UnsupportedOperationException ignore)
        {
            //if can't remove all view (e.g. adapter view) - no problem 
        }
    }
}
...