Подтвердить что ты не робот

Как освободить (принудительно, при необходимости) 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
4b9b3361

Ответ 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().

Примечание: нет необходимости менять фон на черный.