Вы можете использовать этот метод для декодирования изображений.Это может сделать их намного легче.Помните, что изображения становятся растровыми, когда они отображаются, увеличивая потребление памяти.
public static Bitmap decode(byte[] imageByteArray, int width, int height) {
// Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeByteArray(imageByteArray, 0, imageByteArray.length,
o);
// Find the correct scale value. It should be the power of 2.
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp / 2 < width || height_tmp / 2 < height)
break;
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
// Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
o2.inTempStorage = new byte[Math.max(16 * 1024, width * height * 4)];
return BitmapFactory.decodeByteArray(imageByteArray, 0,
imageByteArray.length, o2);
// return BitmapFactory.decodeByteArray(imageByteArray, 0,
// imageByteArray.length);
}
, где
width - максимальная ширина в пикселях, которую может иметь imageView.высота - максимальная высота в пикселях, которую может иметь imageView.
Таким образом, растровое изображение станет светлее, а приложение может потреблять меньше памяти.
(ПРИМЕЧАНИЕ. Я скопировал этот метод и изменил егонемного, я не помню первоначальный вопрос, поэтому я не могу поставить URL)
Я использую для обработки изображений в байтовых массивах, и я декодирую их только перед их показом.
Теперь, как говорит Джеймс Л., лучше всего хранить изображения в файловой системе и переносить их в память только при необходимости, но если вы этого не сделаете (мой случай).Вы можете загружать изображения с помощью:
public static byte[] getBytes(InputStream is) throws IOException {
int len;
int size = 1024;
byte[] buf;
if (is instanceof ByteArrayInputStream) {
size = is.available();
buf = new byte[size];
len = is.read(buf, 0, size);
} else {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
buf = new byte[size];
while ((len = is.read(buf, 0, size)) != -1)
bos.write(buf, 0, len);
buf = bos.toByteArray();
}
return buf;
}
public static byte[] downloadFileByteArray(String fileUrl)
throws IOException, MalformedURLException {
URL myFileUrl = null;
myFileUrl = new URL(fileUrl);
HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
return getBytes(is);
}
Если у вас уже есть изображения в памяти, вы сможете превратить их в байтовые массивы, взглянув на методы, которые я представляю.
Кроме этого(и вызывая System.gc ()), вы мало что можете сделать (что я знаю).Может быть, удалив BMP в onPause () и onDestroy () и восстановив их в onResume (), если это необходимо.