【问题标题】:Bitmap size exceeds VM Budget? [duplicate]位图大小超过 VM 预算? [复制]
【发布时间】:2014-08-29 20:41:22
【问题描述】:

我想在 gridview 中显示我的图像(存储在可绘制文件夹中)。有 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);
}

【问题讨论】:

  • 将图片缩小为适合在移动设备上显示的缩略图尺寸
  • 类似,但不完全重复。

标签: android bitmap out-of-memory


【解决方案1】:

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

这里有一些选项:

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

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

这是选项 #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);

这应该让你开始。

【讨论】:

    【解决方案2】:

    您的位图可能太大了。

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

    【讨论】:

    • 这更适合评论,而不是答案,尤其是这些位图有多大?
    猜你喜欢
    • 2012-08-19
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2012-08-12
    • 2011-04-26
    相关资源
    最近更新 更多