hãy có một cái nhìn vào câu hỏi có liên quan của tôi:
High resolution Image - OutOfMemoryError
Cố gắng hạn chế tối đa việc sử dụng bộ nhớ của ứng dụng của bạn bằng cách giữ hình nền càng nhỏ càng tốt.
này có thể được thực hiện thông qua:
- cắt xén hình ảnh để nó phù hợp với màn hình
- nén hình ảnh tiếp theo (sử dụng ví dụ photoshop) trước khi thậm chí sử dụng nó trong các ứng dụng
- sử dụng dưới đây phương pháp tải bitmap của bạn
- tái chế bitmap ngay khi bạn không cần đăng nhập
- đảm bảo bạn không giữ nhiều bản sao trong bộ nhớ
- thiết lập các tài liệu tham khảo để null sau khi sử dụng bitmap
Hãy chắc chắn rằng hình ảnh mà bạn thiết lập như là một nền tảng được nạp đúng cách (ví dụ cắt kích thước, ví dụ phù hợp với kích thước màn hình) và phát hành từ bộ nhớ ngay sau khi chúng không còn cần thiết nữa.
Đảm bảo bạn chỉ có một phiên bản Bitmap trong bộ nhớ. Sau khi hiển thị, hãy gọi recycle()
và đặt tham chiếu của bạn thành không.
Đây là cách bạn có thể tải hình ảnh của bạn:
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
public static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
// Calculate ratios of height and width to requested height and width
final int heightRatio = Math.round((float) height/(float) reqHeight);
final int widthRatio = Math.round((float) width/(float) reqWidth);
// Choose the smallest ratio as inSampleSize value, this will guarantee
// a final image with both dimensions larger than or equal to the
// requested height and width.
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
Nhờ Adam Stelmaszczyk cho mảnh đẹp mã này.
Nguồn
2013-08-23 22:11:04
Như được đề cập trong nhiều câu hỏi này, không sử dụng hình nền lớn (> 30MB trong trường hợp của bạn). – kabuko
Có rất nhiều câu hỏi tương tự như thế này trong StackOverFlow. Tôi đã cố gắng để làm cho một bản tóm tắt của nhiều lựa chọn thay thế để giải quyết này: http://stackoverflow.com/questions/11820266/android-bitmapfactory-decodestream-out-of-memory-with-a-400kb-file-with-2mb- f/16528487 # 16528487 –
ngoài việc không sử dụng một hình ảnh rất lớn, nên xem xét khả năng của các thiết bị, vấn đề thực sự là thiết bị không có khả năng sạc như nền mà hình ảnh khổng lồ. –