Как узнать, сколько свободного размера кучи доступно для растрового изображения для Android 2.*?
Наше приложение использует много растровых изображений. Он отлично работает, например, на G1, XOOM. Но в HTC Desire есть ошибка OutOfMemory. В коде мы используем try/catch(OutOfMemoryError e) и все устройства (кроме Desire) выдают исключение, но HTC просто убивает приложение без исключения OOM. Мы ограничили объем памяти для растровых изображений до 12 Мб, и казалось, что это решение решило проблему, но у клиента все еще есть проблема с HTC Desire HD. Есть OOM даже с ограничением в 12 Мб. Вот журналы:
06-07 12:03:43.978 E/dalvikvm-heap( 29616):1140128-byte external allocation too large for this process.
06-07 12:03:43.978 E/dalvikvm( 29616):Out of memory: Heap Size=12311KB, Allocated=9420KB, Bitmap Size=12139KB, Limit=21884KB
06-07 12:03:43.978 E/dalvikvm( 29616):Trim info: Footprint=15751KB, Allowed Footprint=15751KB, Trimmed=3440KB
06-07 12:03:43.978 E/GraphicsJNI( 29616):VM won't let us allocate 1140128 bytes
AFAIK Существуют различные ограничения размера кучи для устройств (G1: 16 МБ, Droid: 24 МБ, Xoom 48 МБ). На мой взгляд, система должна давать как минимум 16 МБ, но у нас есть ООМ с 12 МБ. Мой вопрос: как узнать, сколько свободного размера кучи доступно для растрового изображения для Android 2.*? Или, пожалуйста, посоветуйте, как избежать такой проблемы другими способами. К вашему сведению, мы не можем использовать меньше растровых изображений, особенно когда оно отлично работает на других устройствах. Заранее благодарю за любую помощь!
2 ответа
Ты можешь попробовать
Runtime.getRuntime().maxMemory();
или метод деятельности
getMemoryInfo(ActivityManager.MemoryInfo;
Кроме того, вы можете переопределить активность
onLowMemory();
метод, в котором вы можете обработать то, что произойдет, когда Activity get получит уведомление о проблеме с памятью, прежде чем его отключить. И вы должны также проверить этот ответ от разработчика Android на памяти Android/Linux.
Это исключение OutOfMemory происходит из-за утечки памяти, а не из самого файла. Вы переопределяете методы жизненного цикла активности, такие как onStop, onResume, onDestroy?