简单叙述下----踩坑场景:
用户中心界面(假设为A界面):有一个圆形头像,当前头像状态为用户还未设置或者前一次Glide加载失败而设置的占位图。接下来通过拍照或者本地相册裁剪后,将图片通过onActivityResult回传到A界面,然后上传到服务器。如果上传成功,就setImageBitmap到头像照。但是你会发现图片不显示或者刷新后才能显示。
原因:
当A界面(Activity或者Fragment) 去相册或者拍照,然后拿到照片返回A界面这个过程,A界面生命周期会经历以下变化: onStop-> onActivityResult-> onStart -> onResume.
当选中的图片信息被回传到onActivityResult后,setImageBitmap这张图片到头像中()。然后A界面的onStart被触发。
由于当前头像状态为用户还未设置或者前一次Glide加载失败而设置的占位图,所以前一次Glide中图片请求状态值为失败。
而Glide框架会监听了当前页面(Activity或者Fragment)的生命周期。A界面onStop时,Glide将调用pauseRequests暂停所有running请求。A界面onStart时,Glide会重新启动除完成、取消、真正running以外的所用请求。这会让失败的请求会重新再请求一遍-----还是失败。所以Glide 又会给头像设置占位图,导致setImageBitmap的头像图片被覆盖了。
下面源码分析:
下面的类为Glide:3.7.0中的
GenericRequestBuilder: 添加生命周期监听
RequestManager:onStart
RequestTracker:
GenericRequest:
后面分析参考:https://blog.youkuaiyun.com/silently_frog/article/details/100514515
解决方法:
1. 取消该图片在glide中的请求,再setImageBitmap
Glide.clear(logo);
logo.setImageBitmap(photo);
2. 由于所有请求被存放在Set中,所以再给该图片设置一个Glide请求。将前一个Glide去掉。
Glide.with(this) .load(FileUtilUp.bitmapToBytes(photo));
RequestTracker: