Последствия drawable.setCallback (null); - PullRequest
15 голосов
/ 04 октября 2011

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

Поскольку поддержание Drawables кэшируется в каждомДля активности потребовался бы дополнительный код, я попытался отменить их немедленно после setImageDrawable(drawable), и пока не вижу никаких последствий.
Это код из класса MyImageView (extends ImageView):

setImageDrawable(drawable);
d.setCallback(null);

В отладчике я ясно вижу, что до обратного вызова первой строки задано значение NULL, после первой строки он устанавливается на этот imageView, а после этого я снова устанавливаю его на NULL.Обычно это отображается после этого ..

Документация для setCallback (Drawable.Callback cb) состояний:

Привязать объект Drawable.Callback к этому Drawable.Требуется для клиентов, которые хотят поддерживать анимированные рисунки.

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

. Существуют ли некоторые граничные условия, в которых те рисованные объекты с обратным вызовом, установленным в ноль, вызовут проблему?Не отображается или NPE?

1 Ответ

19 голосов
/ 08 октября 2011

Вы не должны кэшировать Drawables - объект Drawable имеет очень большое состояние и предназначен для использования одним и только одним владельцем.

Если вы хотите реализовать кеш, вы должны кэшировать константное состояние отрисовки.

Постоянное состояние можно получить с помощью:

http://developer.android.com/reference/android/graphics/drawable/Drawable.html#getConstantState()

(Обратите внимание, что этот метод может возвращать ноль; не все Drawables имеют постоянное состояние.)

Позже вы можете создавать новые Drawables из постоянного состояния с помощью:

http://developer.android.com/reference/android/graphics/drawable/Drawable.ConstantState.html#newDrawable(android.content.res.Resources)

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

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

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