Glide-----拍照或者相册裁剪的圆形图片不显示或者刷新后才能显示

本文分析了在使用Glide框架加载图片时,因页面生命周期变化导致新图片被占位图覆盖的问题。深入探讨了Glide的请求管理机制,并提供了两种有效解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单叙述下----踩坑场景:

        用户中心界面(假设为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:

             

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值