Android ListView: out of memory exception
本问题已经有最佳答案,请猛点这里访问。
我正在从SD卡读取一些图像,并在列表视图中显示它们是自定义列表适配器中的代码
1 2 3 | File imgFile = new File(act.getimage()); Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); holder.picView.setImageBitmap(myBitmap); |
但在加载此listView时我得到
这是LogCat
1 2 3 | 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) |
使用此功能可解码sdcard路径中的图像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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; } |
如何使用?
1 | holder.picView.setImageBitmap(decodeFile(act.getimage())); |
注意:
您可以根据需要更改REQUIRED_SIZE值。
这是一个非常常见的错误。 您正在为每个列表元素使用一个大图像,而不是使用一个小拇指...
我使用一个名为picasso的lib来处理图像,检查出来。
检查此示例。
1 | Picasso.with(YOUR_CONTEXT).load(new File(YOUR_PATH)).fit().centerCrop().into(YOUR_VIEW); |
使用android-query在listview中显示图像。
你可以在这里找到android-query的教程
我希望它有所帮助。