Как освободить (принудительно, при необходимости) 9-патч (NinePatchDrawable) из памяти на Android?
Как заставить NinePatchDrawable выпустить байты BitMap, которые он разбирает из "res"?
Как разработчик Android, я испытываю давление, чтобы контролировать использование памяти в моих играх.
Я работаю для управления использованием памяти, освобождая ресурсы как можно быстрее, после того как они больше не используются. Для этого я поддерживаю список всех загруженных ресурсов и очищаю/освобождаю их из памяти, как только я с ними сделаю.
В моем приложении используется несколько различных типов графических ресурсов
- BitMap
- BitMapDrawable
- Drawable
- NinePatchDrawable
Как снять эти объекты прямо сейчас?
- BitMap: я использую метод "recycle()"
- BitMapDrawable: я использую метод getBitMap(). recycle()
- Drawable: я установил их в null (не работает)
- NinePatchDrawable: я установил их в null (не работает)
Что вы пробовали?
- Вы не можете "getBitmap()" сделать NinePatchDrawable
- Вы не можете преобразовать NinePatchDrawable в BitMapDrawable (даже если они оба являются битами на основе Bitmap)
- Кажется, есть способ самостоятельно проанализировать PNG, самостоятельно загружая байты в NinePathDrawable - это может привести меня к точке, где я могу просто "переработать" базовый BitMap, но это похоже на то, m изобретать колесо (http://code.google.com/p/android/issues/detail?id=13542)
Мои текущие правила:
- Никогда не используйте @drawable/in XML
- Никогда не андроид: фон в XML
- Никогда не андроид: src в XML
Ответы
Ответ 1
Чтобы использовать: @drawable/, android: background, android: src в xml, вы всегда можете использовать пользовательские классы.
Итак, вместо
<ImageView android:src="@drawable/bg" />
вы можете использовать:
<com.myPackage.CustomImageView android:src="@drawable/bg" />
Чем в CustomImageView в конструкторе вы можете получить ссылки на ваши атрибуты xml:
private Drawable bg2;
private Drawable bg1;
public void CustomImageView(Context context, Attrs attrs)
{
super(context, attrs);
// Use this to get references to your xml attributes
int resourceId = attrs.getAttributeResourceValue("android", "src", 0);
bg1 = getResources().getDrawable(resourceId);
// Or for the 'background' attribute
resourceid = attrs.getAttributeResourceValue("android", "background", 0);
bg2 = getResources().getDrawable(resourceId);
// Now you can recycle() your 'bg' whenever you're done
}
Таким образом, вы можете извлечь ссылки из своего xml. И переработайте() их, если считаете, что это соответствует
Ответ 2
Я тоже разочарован ошибкой outofmemory. Мое приложение выбрасывало ошибку outofmemory всякий раз, когда пользователь переходил от одной активности к другой. Установка моих drawables в null и вызов System.gc()
не помогли, а также не переработали мои bitmapDrawables с помощью getBitMap().recycle()
. Android будет продолжать выдавать ошибку outofmemory с первым подходом, и он будет вызывать сообщение об ошибке холста всякий раз, когда он пытается использовать переработанную растровую карту со вторым подходом.
Я принял третий подход. Я установил все представления равными нулю, а фон - черным. Я делаю эту очистку в методе onStop(). Это метод, который вызывается, как только активность больше не видна. Метод onDestroy() не может быть вызван. Кроме того, если очистка выполняется в методе onPause(), пользователи получат черный экран перед переходом на следующий экран.
Чтобы предотвратить появление черного экрана, если пользователь нажимает кнопку "Назад" на устройстве, я затем перезагружаю активность в методе onRestart(), вызывая методы startActivity (getIntent()) и затем finish().
Примечание: нет необходимости менять фон на черный.