内存堆增长与位图

时间:2014-05-09 02:27:10

标签: java android memory bitmap

我正在从图库中选择一张图片,并将其显示在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();
        }

    }

所有变量都已在课程开始时正确初始化,因此这不是问题

感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:0)

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();