Android: очистка памяти на приложение уничтожить - PullRequest
1 голос
/ 15 января 2012

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

Теперь я понял, что когда янесколько раз запустить и запустить приложение на моем мобильном устройстве huawei, я получаю исключение OutOfMemoryException в тот момент, когда приложение пытается выделить немного памяти для растровых изображений.Так что я думаю, что именно растровые изображения создают проблемы.Я знаю, что есть метод bitmap.recycle ().

Теперь мой вопрос: как лучше очищать память?Почему нет какого-либо метода View, такого как View :: onDestroy (), который можно реализовать в целях очистки?

РЕДАКТИРОВАТЬ: пример

мой класс CirclyButton (extends Button) всегда рисуеткэшированное растровое изображение onDraw:

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawBitmap(this.getDefaultBitmap(), 0, 0, paint);
    }
    private Bitmap getDefaultBitmap(){
        if(mBitmapDefault == null){
            mBitmapDefault = Bitmap.createBitmap(8*radius, 8*radius, Config.ARGB_8888);
            Canvas canvas = new Canvas(mBitmapDefault);
            this.drawDefault(canvas);
            return mBitmapDefault;
        }
        return mBitmapDefault;
    }

Так что я думаю, что эти выделенные данные должны быть где-то переработаны ...?

Ответы [ 2 ]

2 голосов
/ 15 января 2012

Представления не имеют метода onDestroy, потому что представления обычно не уничтожаются, а действия имеют. Представление не будет просто уничтожено, если с его активностью ничего не произойдет (Если вы не надуете другой макет ... Это не так, верно?), И если что-то случится с его активностью, у вас будет вызываться обратный вызов.

Если есть метод recycle(), обязательно вызовите его. И удалите все ссылку на объекты, занимающие память в onDestroy, то есть:

@Override
public void onDestroy() {
    object1 = null;
    object2 = null;
    //...
}

Так что ГХ может делать свою работу. У меня была такая же проблема с AdView AdMob, хотя у них был метод destroy, который не очень помог. Но удаление моих ссылок на представление решило проблему.

1 голос
/ 15 января 2012

Предоставьте больше информации о том, где вы используете свои растровые изображения, у меня есть серьезный опыт работы с изображениями и экономии памяти.

Например, в моем приложении у меня есть список некоторых данных, которые отображают растровое изображение в каждой строке. Я храню свой список во фрагменте (для поддержки фрагментов я использую библиотеку совместимости) и перерабатываю свои растровые изображения для этого фрагмента методом onDestroy.

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

...