我有一个 ImageView,我需要根据用户 GPS 位置获取图像资源()。有 6 张图像,随着 2 点之间的距离减小,我将图像替换为新资源。
我正在 Galaxy S4 上测试该应用程序,问题是在非常小的随机加载次数后,应用程序由于 OutOfMemory 而崩溃。
有没有缓存图片的好方法?(也许我需要使用 AsyncTask 加载它们)
图像为 400x400px png- 24 位,具有透明度。
谢谢
我有一个 ImageView,我需要根据用户 GPS 位置获取图像资源()。有 6 张图像,随着 2 点之间的距离减小,我将图像替换为新资源。
我正在 Galaxy S4 上测试该应用程序,问题是在非常小的随机加载次数后,应用程序由于 OutOfMemory 而崩溃。
有没有缓存图片的好方法?(也许我需要使用 AsyncTask 加载它们)
图像为 400x400px png- 24 位,具有透明度。
谢谢
尝试使用这个:
public static Bitmap decodeSampledBitmapFromResource(String uri,
int reqWidth, int reqHeight, int orientation) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(uri, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth,
reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
Bitmap decodeFile = BitmapFactory.decodeFile(uri, options);
int rotate = 0;
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;
}
Matrix matrix = new Matrix();
// matrix.postScale(scaleWidth, scaleHeight);
matrix.postRotate(rotate);
Bitmap rotatedBitmap = Bitmap.createBitmap(decodeFile, 0, 0,
decodeFile.getWidth(), decodeFile.getHeight(), matrix, true);
return rotatedBitmap;
}
private 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) {
if (width > height) {
inSampleSize = Math.round((float) height / (float) reqHeight);
} else {
inSampleSize = Math.round((float) width / (float) reqWidth);
}
}
return inSampleSize;
}
Galaxy S4 最有可能与xxhdpi
可绘制对象一起使用,因此您将所有内容放入mdpi
其中会使系统放大您的图像以匹配 S4 的 dpi 级别,因此会OutOfMemory
出现错误。尝试根据 dpi (包括xhdpi
和xxhdpi
)缩放和放置可绘制对象在它们各自的文件夹中,然后可能会优化您的代码。