android中用户头像设置的一点心得——关于bitmap被回收的问题

最近在做的项目中,处理到用户更换头像的功能,实现方法大致如下:

1.点击用户头像,弹出从相册中选取或者拍照选取,选取好了之后,调用图片剪裁功能进行剪裁,最后返回其bitmap对象,工具用的是一个photoTool;

2.对于返回的bitmap对象,获取其路径,并将其转化为File对象,上次至服务器,并获取服务器返回的服务器端图片存放地址,并保存。

3.若上次成功则将用户头像imageView.setImageBitmap(bitmap),否则则提示更换失败。

当然,期间最后将图片进行缩放,避免占用内存过大。

本来做得好好的,功能都实现了,但最近对整个app进行测试时,遇到更新头像成功后,头像没有加载,而是出现一片黑,并且报出

Cannot generate texture from bitmap异常,百度尝试别人的解决方案,问题都依旧存在,几经周折,发现在我通过bitm对象去获取图片路径之后,我的bitmap对象被android的GC给回收了!!!于是我另外初始一个mbitmap对象将剪裁后返回的bitmap对象保存起来,再去获取路径,之后发现两个bitmap对象都被回收,看来是内存占用过大,导致其被回收,而被回收的了资源是无法再利用的了,但是,我已经拿到了我本地图片的路径了!!!这是个突破点,最后的解决方案是,在获取图片路径回来之后,用路径再生成一个bitmap对象。这个bug是比较难发现的,因为只有在特定条件下才会发生,即在机器内存不够的时候···

最后贴上部分代码:

/photoTool工具,剪裁后返回的接口
@Override
public void onCropComplete(Bitmap bitmap) {
    String path = BitmapUtil.saveBitmap(this, bitmap);//获取剪裁后bitmap的路径
    Bitmap bitmap1 = BitmapUtil.getimage(path);//重新生成bitmap对象
    mHandler.uploadMyAvatar(path, ivAvater, bitmap1);//上传至服务器
    photoTool = null;
}

public void uploadMyAvatar(String path, final ImageView imageView, final Bitmap bitmap) {
    Network.newInstance(API.COMMON_Upload).upload(null, new ResponseCallback<String>() {

        @Override
        public void onSuccess(String response) {
            imageView.setImageBitmap(bitmap);//将头像设置为更新后的bitmap
            User user = UserUtil.getUser();
            user.setDoctorPic(response);//将服务返回的路径保存到用户信息中,下次重新打开app时,再去服务器拉取
                                         用户头像
        }

        @Override
        public void onFailed(Exception e) {
            showInfo("更换头像失败");
        }
    }, new Pair<>("file", new File(path)));
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值