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

        @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)));
}


你可能感兴趣的:(android)