2012-01-11 3 views
4

Следующее за Storing a Bitmap resource in a static variable, кажется, что сохранение статической ссылки на android.graphics.Bitmap в View может привести к утечке ссылки на этот первый View, который его создал. Какой идиоматический способ решить эту проблему в Android? Я не хочу вызывать BitmapFactory.decodeResource(resource, id) каждый раз, когда экземпляр этого представления создается, потому что это будет сделано (много раз) в каждой отдельной Деятельности. Я хочу, чтобы этот маленький Bitmap всегда оставался в памяти. Итак, каков правильный способ сделать следующее:Как сохранить растровое изображение в памяти

public class MyView extends View { 
    private static Bitmap star; 
    public MyView(Context context) { 
     synchronized(this) { 
      if (star == null) { 
       star = BitmapFactory.decodeResource(getResources(), R.drawable.star); 
      } 
     } 
    } 
    // ... 
} 

ответ

3

Создайте статический метод очистки в своем представлении, который вы вызываете из своей активности (). В этом вызове вызовите растровое изображение recycle() и очистите ссылку. Аналогично, вместо создания растрового изображения в конструкторе, вы получите запрос инициализации, который вы вызываете в вашей активности onResume().

Если у вас есть проблемы с перекрытием, потому что ваш вид используется во всех действиях, вы можете иметь вызовы инициализации и очистки, чтобы поддерживать счетчик ссылок, так что растровое изображение уничтожается только тогда, когда число обращается к 0 Если битмап достаточно мал, вы можете также рассмотреть onCreate()/onDestroy().

Не забудьте проверить ссылку на растровое изображение в классе вида для null до ее использования.

+0

Если я помещаю растровое изображение в класс приложения - нужно ли очищать ссылки? – Kostadin

0

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

Синхронизированный статический метод.


Конструкторы всегда надежны в потоковом режиме, поэтому вам не нужно использовать синхронизацию или проверить значение null. Вы можете просто установить поле (и сделать его final)

+1

Я думаю, вы, возможно, пропустили, что 'star' является' static' в коде OP. –

0

почему бы не просто загрузить изображение в деятельности, где мнения будут и передать растровое изображение с видом

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

Смежные вопросы