可能重复:
Android: Strange out of memory issue while loading an image to a Bitmap object
OutOfMemoryError: bitmap size exceeds VM budget :- Android
我有一个应用程序,用户可以在图库中保存新闻后,用户可以拍照或使用图库中已有的图片并附加到新闻(我只保存图像路径内容:/ / ...) ,我在ListView中显示带有图像标题和日期的所有新闻。要在适配器中显示图像我正在使用以下内容:
...
image.setImageURI(null);
System.gc();
image.setImageURI(Uri.parse(noticia.getIMAGEM()));
...
然而即使使用System.gc();每个加载的新图像
12-12 14:59:37.239:E / AndroidRuntime(4997): java.lang.OutOfMemoryError:位图大小超过执行者VM预算
也已尝试使用
image.setImageURI(null);
System.gc();
在onResume(),onPause(),onDestroy()中,但没有任何效果。
还阅读了这篇文章:[link] [1]
if(!((BitmapDrawable)image.getDrawable()).getBitmap().isRecycled()){
((BitmapDrawable)image.getDrawable()).getBitmap().recycle();
}
Bitmap thumbnail = null;
try {
thumbnail = MediaStore.Images.Media.getBitmap(context.getContentResolver(), Uri.parse(img));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
image.setImageBitmap(thumbnail);
然后我收到以下错误:
12-12 15:28:42.879:E / AndroidRuntime(5296): java.lang.RuntimeException:Canvas:尝试使用循环位图 android.graphics.Bitmap@40756520
此外,当我的列表视图向上和向下滚动时,它一直在崩溃,我相信它正在请求图像..
我不知道还能做什么,有什么提示吗?
修改
我发现同一个解决方案中的另一个帖子对这个问题起了很好的作用,但是我相信它需要一个缓存来处理图像,因为当列表向上或向下滚动时,她就会对用户体验非常不利。有什么想法要解决吗?
以下代码:
适配器中的: ...
String imagePath = getPath(Uri.parse(img));
image.setImageBitmap(decodeSampledBitmapFromResource(imagePath, 85, 85));
...
方法:
public String getPath(Uri uri)
{
Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
return cursor.getString(idx);
}
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 = 2;
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;
}
public static Bitmap decodeSampledBitmapFromResource(String resId,
int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(resId, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(resId, options);
}
答案 0 :(得分:0)
听起来你想从本地画廊获取缩略图。 SDK直接提供了更好的解决方案:
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap thumbnail = Thumbnails.getThumbnail(context.getContentResolver(), /*ID of the local item*/, Thumbnails.MINI_KIND, options);
// Calculate inSampleSize
options.inSampleSize = UIUtils.calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
thumbnail = Thumbnails.getThumbnail(context.getContentResolver(), /*ID of the local item*/, Thumbnails.MINI_KIND, options);