【问题标题】:Memory heap growth with bitmap使用位图的内存堆增长
【发布时间】:2014-05-09 02:27:09
【问题描述】:

我正在从图库中选择一张图片并将其显示在 ImageView 中。但是,当我运行它时,我可以看到巨大的堆增长(高达 60MB)。

代码如下:

    else if(requestCode == PICK_IMAGE && resultCode == RESULT_OK){             

        Uri selectedImage = data.getData();
        try {
            img = (Bitmap)MediaStore.Images.Media.getBitmap(
                    this.getContentResolver(), 
                    selectedImage);


        } catch (FileNotFoundException e) {
            Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show();
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        ImgContainer.setImageBitmap(img);       
        img.compress(Bitmap.CompressFormat.PNG, 100, boas);
        byteArray = boas.toByteArray();     
        try {
            boas.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

所有变量都已在类开始时正确初始化,所以这不是问题

感谢您的宝贵时间和帮助。

【问题讨论】:

  • 图像有多大,这是在某种循环中吗?
  • 它不在循环中。我不知道图像有多大,但它正在为画廊中的一些图像做这件事。有些图像加载速度很快,有些使我的 UI 冻结并消耗大量内存。我怎样才能防止这种情况发生?

标签: java android memory bitmap


【解决方案1】:
img = (Bitmap)MediaStore.Images.Media.getBitmap(
                    this.getContentResolver(), 
                    selectedImage);

每次您创建新对象并将其分配给 img。 改变它可能会奏效。

编辑:

//这可以是你的单例类

public class ImageHelper {

    private static ImageHelper imageHelper;

        private Bitmap imageBitmap;

        private ImageHelper() {


          imageBitmap = //source of ur image

        }

        public static ImageHelper getInstance() {
        if(imageHelper==null) {
            imageHelper = new ImageHelper();
        }
        return imageHelper;
        }

        public Bitmap getImage() {

            return this.imageBitmap;
        }

}

通过这样做,您将只有 1 个 ImageHelper 对象,该对象将仅包含图像的 1 个副本。

如果你有一个不同的点来设置图像,比如你从图库中挑选之后,

你可以有一个setter方法或者这个,

public void setImage(Bitmap image) {
    this.imageBitmap = image;
}

你可以称之为

ImageHelper.getInstance().setImage(image);

在你想用的地方,你可以通过

ImageHelper.getInstance().getImage();

【讨论】:

  • 改成什么?谢谢
  • 通过改变它意味着你可以拥有一个持有该图像位图的单例类的静态对象,并且你可以在任何需要的地方使用该位图,而不是一次又一次地创建新的位图。
  • Logcat 给出内存不足异常。堆有时会增长到 60MB。抱歉,我是编程和 Android 新手,我不明白你的回答。什么是单例?我的意思是,我不明白你的建议。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
  • 2013-01-09
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
相关资源
最近更新 更多