До сих пор я не нашел надежного способа справиться с размером изображения в сравнении с доступной памятью. Проблема в том, что память очень быстро фрагментируется, так что у вас может быть 10 МБ свободного места, но нет свободного места для образа 2 МБ. Что действительно необходимо, так это размер самого большого свободного места, но, похоже, нет никакого способа получить это. Лучше было бы дефрагментировать память, но такой функции для этого тоже не существует.
Тем не менее, если объем доступной памяти меньше, чем у изображения, вы можете быть уверены, что произойдет сбой, если попытаетесь его использовать, поэтому имеет смысл хотя бы проверить его перед использованием.
Теперь, когда планшеты конца 2012 года имеют разрешение 1920x1280, нам нужно 20 МБ непрерывной памяти для одного фонового изображения! Похоже, что некоторые из этих планшетов в настоящее время допускают кучи до 256 МБ, но, несмотря на то, что выбрасывание большего объема виртуальной памяти, по-видимому, решает эту проблему, нам действительно необходим дефрагментатор памяти или способ зарезервировать пространство.
Существует один прием, который может помочь, если размер изображения не масштабируется или не изменяется, и каждое измененное изображение имеет одинаковый размер И вы ограничиваете свое приложение до Android 3.0 +:
Options opt2 = new BitmapFactory.Options();
opt2.inBitmap = mBitmap; // reuse mBitmap to reduce out of memory errors
mBitmap = BitmapFactory.decodeResource(getResources(), myDrawable, opt2);
Это будет повторно использовать ту же область памяти mBitmap для изображения.