Android ListView:内存不足异常

时间:2014-04-04 09:50:58

标签: android android-listview out-of-memory android-bitmap

我正在从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)

3 个答案:

答案 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)

使用android-query在listview中显示图像。

你可以找到android-query here

的教程

我希望它有所帮助。