Android ListView:内存不足异常

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时我得到outOfMemory Exception。 这是因为图像的大小?
这是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的教程

我希望它有所帮助。