位图大小超过VM预算?

时间:2014-08-29 20:41:23

标签: android bitmap out-of-memory

我想在gridview中显示我的图像(存储在drawable文件夹中)。有12张图片。为此,我做了一个ImageAdapter类。当我打开我的GridViewActivity我的应用程序崩溃时说“内存不足:位图大小超过VM预算”。这是代码。

ImageAdapter.java

public class ImageAdapter extends BaseAdapter {

Context context;

Integer[] imageIDs = { R.drawable.lw01_04_001, R.drawable.lw01_04_002,
        R.drawable.lw01_04_003, R.drawable.lw01_04_004,
        R.drawable.lw01_04_005, R.drawable.lw01_04_006,
        R.drawable.lw01_04_007, R.drawable.lw01_04_008,
        R.drawable.lw01_04_009, R.drawable.lw01_04_010,
        R.drawable.lw01_04_011, R.drawable.lw01_04_012, };

public ImageAdapter(Context ctx) {
    context = ctx;
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return imageIDs.length;
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return position;
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    ImageView imageView;

    if (convertView == null) {
        imageView = new ImageView(context);
        imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setPadding(5, 5, 5, 5);
    } else {
        imageView = (ImageView) convertView;
    }
    imageView.setImageResource(imageIDs[position]);
    return imageView;
  }
}

GridViewActivity.java

public class GridViewActivity extends ActionBarActivity {

private Utils utils;
private ImageAdapter imageAdapter;
private GridView gridView;
private int columnWidth;
Context context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_grid_view);

    context = this;
    gridView = (GridView) findViewById(R.id.grid_view);

    utils = new Utils(this);

    // Initilizing Grid View
    InitilizeGridLayout();

    imageAdapter = new ImageAdapter(context);

    // setting grid view adapter
    gridView.setAdapter(imageAdapter);
}

2 个答案:

答案 0 :(得分:0)

您的图片可能太大了。当您为ImageView提供图像资源ID时,ImageView会生成该资源的位图,然后将其保存在内存中。虽然大多数现代设备都具有足够的内存来轻松处理多个大图像,但Android会为每个应用分配极少量的内存。这意味着您在处理图像时需要聪明,特别是当您需要显示其中的许多图像时。

以下是一些选项:

  1. 确保可绘制文件夹中的图像不大于它们所需的图像(即,它们不应大于显示它们的视图的尺寸)。这可能是最佳选择,因为除了降低内存要求外,您还将减少生成的APK文件的大小。

  2. 如果您不想缩小可绘制文件夹中的图像(例如,如果用户点击它们,您可能需要以完整尺寸显示它们),请在运行时缩小图像。此选项需要更多代码,但您可以灵活地显示图像,而不会遇到内存不足问题。

  3. 以下是选项#2的代码示例:

     Options opts = new Options();
        opts.outWidth = 85; //Based on your size requirement.
        opts.outHeight = 85;
        Bitmap b = BitmapFactory.decodeResource(getResources(), imageIDs[position], opts);
        imageView.setImageBitmap(b);
    

    这应该让你开始。

答案 1 :(得分:-1)

您的位图可能太大了。

我建议你查看这个问题:Out of Memory Error ImageView issue