You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:06:00