Когда нужно позаботиться об управлении памятью Bitmap или переработать растровое изображение в андроиде?
Например, существует несколько способов создания растровых изображений в android, например, следующих
Bitmap.createBitmap
Bitmap.createScaledBitmap
BitmapFactory
Но когда android выделяет память для растрового изображения, которое должно быть очищено, так что в будущем приложении мы не столкнемся с проблемой нехватки памяти
В версиях Android до 3.0 Bitmaps выделяются вне VM. Android возвращает эту память в метод Bitmap finalize(). Вы можете позволить Android быстрее восстановить память, вызвав Bitmap.recycle() вместо того, чтобы ждать в GC, чтобы вызвать finalize() на них.
Это действительно проблема, если вы создаете и отбрасываете много битмапов. То есть, если вы быстрее распределяете память, GC может очистить оставшийся мусор, после чего вы получите OutOfMemoryError.
В android 3.0 и более поздних версиях битмап-память выделяется внутри виртуальной машины, поэтому память Bitmap может быть восстановлена без необходимости называть finalize() на них.
вы перерабатываете растровое изображение, когда вам это не нужно. например
@Override
protected void onPause(){
super.onPause();
if(bitmap !=null){
bitmap.recycle();
bitmap = null;
}
}
@Override
protected void onResume() {
super.onResume();
if(bitmap !=null){
bitmap.recycle();
bitmap = null;
}
}
Память растровых изображений P.S отличается от каждого устройства, что я имею в виду
Growing Heap
отличается от устройства к другому
например, размер растрового изображения может превышать бюджет VM (Growing Heap) до 240 Мбайт на S4 tested and confirmed by personal testing
, и он не вызывает OutOfMemoryError
, но в некоторых других устройствах, если размер растрового изображения превышает (Growing Heap) до 16 МБ, это может вызвать OutOfMemoryError
его сильно отличается от устройства к другому, потому что некоторые устройства имеют большую кучу, а некоторые нет. и доверять мне, имея дело с Growing Heap, непростая задача.
дополнительная рекомендация - использовать android:largeHeap="true"
в тэге application
внутри манифеста.
`