使用Glide加载视频缩略图时触发无法为已销毁Activity启动加载错误
报错核心原因
该异常触发的本质是调用Glide.with()时传入的Activity实例已经被销毁,Glide内部会主动校验上下文生命周期状态,避免内存泄漏,因此直接抛出异常终止加载流程。通常出现在页面关闭后,适配器的渲染任务还在排队执行的场景。
可行解决方案
- 方案1:使用View作为Glide上下文(最优推荐)
Glide的with()方法支持直接传入要加载的目标View实例,会自动绑定View所属的上下文生命周期,View被移除时会自动终止加载任务,不需要持有外部Activity实例,也不需要额外做生命周期判断。修改后的代码如下:
RequestOptions requestOptions = new RequestOptions(); requestOptions.isMemoryCacheable(); // 直接用目标ImageView作为with参数 Glide.with(viewHolder.Right_videoview) .setDefaultRequestOptions(requestOptions) .load(dialogList.get(position).getVideoUrl()) .into(viewHolder.Right_videoview);
- 方案2:加载前校验Activity生命周期状态
如果业务必须要使用Activity作为上下文,调用Glide前先判断Activity的存活状态:
// 校验Activity未销毁再执行加载 if (activity != null && !activity.isFinishing() && !activity.isDestroyed()) { RequestOptions requestOptions = new RequestOptions(); requestOptions.isMemoryCacheable(); Glide.with(activity) .setDefaultRequestOptions(requestOptions) .load(dialogList.get(position).getVideoUrl()) .into(viewHolder.Right_videoview); }
如果需要兼容Android 4.2以下版本,去掉isDestroyed()判断、只保留isFinishing()即可。
- 方案3:Fragment场景下优先传入Fragment实例
如果适配器依附于Fragment使用,直接将Fragment实例传入Glide.with(),Glide会自动绑定Fragment的生命周期,Fragment销毁时会自动终止所有未完成的加载任务,避免报错。
业务优化建议
针对视频缩略图加载场景,可以给RequestOptions增加frame()配置,指定取视频的某一帧作为缩略图,提升加载速度:
// 单位为微秒,1000000代表取视频第1秒的帧作为缩略图 requestOptions.frame(1000000);
内容的提问来源于stack exchange,提问作者Jose Miguel Reynoso Almonte
相关产品推荐
相关产品推荐

