请教一下,关于BITMAP占用内存回收的问题。

JavaEye 2013-07-23 10:32:29
现在做了一个图片上传功能,总是会提示内存溢出,刚刚开始一两张图片还是挺好,但是等用户慢慢的提交完成,然后后面又拍照打算传的时候,就会报出内存溢出,我就很纳闷,为什么之前已经上传完毕的图片所占用的内存,系统不会将它们回收的吗?顺带附上一段代码,这样帮忙看看,是否写法跟内存占用大有关系??

附一段代码:
mBitmap1 = getSmallBitmap(image_path); //options.inSampleSize 设置缩放之类的。
if(mBitmap1!=null)
mBitmap1=circle(mBitmap1); //方法见红字
//创建画布
mCanvas = new Canvas(mBitmap1);
//创建画笔路径
mPath = new Path();
//创建画笔
mBitmapPaint = new Paint(Paint.DITHER_FLAG);

Bitmap circle(Bitmap bmp) {
if(bmp==null)return null;
int bmpWidth = bmp.getWidth();
int bmpHeight = bmp.getHeight();
float width = (float)Common.screenWidth/bmpWidth;
float height = (float)Common.screenHeight/bmpHeight;
Matrix matrix = new Matrix();
matrix.postScale(width,height);

Bitmap resizeBmp = Bitmap.createBitmap(bmp, 0, 0, bmpWidth, bmpHeight, matrix, true);
if(!bmp.isRecycled()){
bmp.recycle();
bmp=null;
System.gc();
}
return resizeBmp;
}
...全文
301 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
majaw 2013-07-24
  • 打赏
  • 举报
回复
引用 10 楼 a8723832 的回复:
[quote=引用 9 楼 zhyntc54321 的回复:] 全部是强引用,不溢出才怪。 用软引用 还有,中间临时的bitmap也会占用大量内存,尽量不要生成临时的bitmap,使用流,到最后再生成出bitmap。 系统有几个方法是会产生bitmap临时变量的,比如createBitmap,尽量避免。
BitmapFactory.decodeStream??? 是这样吗?抱歉,我接触android不是很久,菜鸟一枚。。。[/quote] BitmapFactory.decodeStream转成流来处理,占用的内存要小一半 mBitmap1 = getSmallBitmap(image_path); 在通过新的imagePath获取Bitmap前,是否可以将这个mBitmap1内存回收下呢
顾小林 2013-07-23
  • 打赏
  • 举报
回复
mBitmap1=circle(mBitmap1); //方法见红字 这个函数最终还是会生成一个bitmap 用完就回收 和你这个函数里面 一样
JavaEye 2013-07-23
  • 打赏
  • 举报
回复
引用 4 楼 shen332401890 的回复:
mBitmap1 这个你上传完了 是否也应该回收呢?
怎么回收?在哪里回收?我回收但是没有看到内存减少。。反而还是占着。
顾小林 2013-07-23
  • 打赏
  • 举报
回复
mBitmap1 这个你上传完了 是否也应该回收呢?
JavaEye 2013-07-23
  • 打赏
  • 举报
回复
引用 1 楼 yuqangy 的回复:
大哥,你new了那么多咋没看见回收呢
还有一些值是需要返回的,所以也应该在特定的地方进行回收吧?
JavaEye 2013-07-23
  • 打赏
  • 举报
回复
引用 1 楼 yuqangy 的回复:
大哥,你new了那么多咋没看见回收呢
兄弟,可以给个QQ么?有些需要问你。
yuqangy 2013-07-23
  • 打赏
  • 举报
回复
大哥,你new了那么多咋没看见回收呢
顾小林 2013-07-23
  • 打赏
  • 举报
回复
楼上的意思貌似是那个 WeakReference 这个 我只能帮你到这了 http://www.2cto.com/kf/201207/139522.html
JavaEye 2013-07-23
  • 打赏
  • 举报
回复
引用 8 楼 shen332401890 的回复:
是这样的 recycle 调用这个函数 只是告诉 系统 这块内存我不用了,至于回收 那个不是你能负责的了,你只是通知,并且你再申请内存的时候这块可以被清理的,应该不矛盾
那我需要怎么样来解决这个内存的问题呢???在这里卡了挺久了。
JavaEye 2013-07-23
  • 打赏
  • 举报
回复
引用 9 楼 zhyntc54321 的回复:
全部是强引用,不溢出才怪。 用软引用 还有,中间临时的bitmap也会占用大量内存,尽量不要生成临时的bitmap,使用流,到最后再生成出bitmap。 系统有几个方法是会产生bitmap临时变量的,比如createBitmap,尽量避免。
BitmapFactory.decodeStream??? 是这样吗?抱歉,我接触android不是很久,菜鸟一枚。。。
zhyntc54321 2013-07-23
  • 打赏
  • 举报
回复
全部是强引用,不溢出才怪。 用软引用 还有,中间临时的bitmap也会占用大量内存,尽量不要生成临时的bitmap,使用流,到最后再生成出bitmap。 系统有几个方法是会产生bitmap临时变量的,比如createBitmap,尽量避免。
顾小林 2013-07-23
  • 打赏
  • 举报
回复
是这样的 recycle 调用这个函数 只是告诉 系统 这块内存我不用了,至于回收 那个不是你能负责的了,你只是通知,并且你再申请内存的时候这块可以被清理的,应该不矛盾
JavaEye 2013-07-23
  • 打赏
  • 举报
回复
引用 6 楼 shen332401890 的回复:
mBitmap1=circle(mBitmap1); //方法见红字 这个函数最终还是会生成一个bitmap 用完就回收 和你这个函数里面 一样
但是回收了之后,内存还是被占着。。。这个有点麻烦。。。

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧