我正在从SD卡读取一些图像,并在列表视图中显示它们是自定义列表适配器中的代码
File imgFile = new File(act.getimage());
Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
holder.picView.setImageBitmap(myBitmap);
但在加载此listView时我得到outOfMemory Exception
。这是因为图像的大小?
这是LogCat
04-04 14:49:37.372: E/AndroidRuntime(18934): FATAL EXCEPTION: main
04-04 14:49:37.372: E/AndroidRuntime(18934): java.lang.OutOfMemoryError
04-04 14:49:37.372: E/AndroidRuntime(18934): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
答案 0 :(得分:2)
使用此功能解码sdcard路径中的图像
public Bitmap decodeFile(String path) {
try {
// Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, o);
// The new size we want to scale to
final int REQUIRED_SIZE = 70;
// Find the correct scale value. It should be the power of 2.
int scale = 1;
while (o.outWidth / scale / 2 >= REQUIRED_SIZE && o.outHeight / scale / 2 >= REQUIRED_SIZE)
scale *= 2;
// Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
return BitmapFactory.decodeFile(path, o2);
} catch (Throwable e) {
e.printStackTrace();
}
return null;
}
如何使用?
holder.picView.setImageBitmap(decodeFile(act.getimage()));
注意:强>
您可以根据需要更改REQUIRED_SIZE值。
答案 1 :(得分:1)
这是一个非常常见的错误。您正在为每个列表元素使用一个大图像,而不是使用一个小拇指......
我使用一个名为picasso的lib来处理图像,然后查看它。
检查此示例。
Picasso.with(YOUR_CONTEXT).load(new File(YOUR_PATH)).fit().centerCrop().into(YOUR_VIEW);
答案 2 :(得分:0)