Glide异常:Crash when activity is destroyed

如果activity已被销毁,在调用 glide 时将抛出 IllegalArgumentException

异常涉及到的是RequestManagerRetriever.java 类中的以下代码.

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private static void assertNotDestroyed(Activity activity) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && activity.isDestroyed()) {
        throw new IllegalArgumentException("You cannot start a load for a destroyed activity");
    }
}

报错信息如下:

Fatal Exception: java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity
       at com.bumptech.glide.manager.RequestManagerRetriever.assertNotDestroyed(RequestManagerRetriever.java:134)
       at com.bumptech.glide.manager.RequestManagerRetriever.get(RequestManagerRetriever.java:102)
       at com.bumptech.glide.manager.RequestManagerRetriever.get(RequestManagerRetriever.java:87)
       at com.bumptech.glide.Glide.with(Glide.java:620)
       at com.myapp.myapp$24.run(MyAppClass.java:977)
       at android.os.Handler.handleCallback(Handler.java:739)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:135)
       at android.app.ActivityThread.main(ActivityThread.java:5431)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707)

Glide没有将这个异常cach而是直接抛出来了,所以如果使用glide的时候,可能出现Activity正常或者异常原因destroy之后显示图片,最好判断一下context

解决方案:

如果使用glide生命周期的特性,在使用glide之前对context进行判断

public boolean isValidContextForGlide(final Context context) {
        if (context == null) {
            return false;
        }
        if (context instanceof Activity) {
            final Activity activity = (Activity) context;
            if (activity.isDestroyed() || activity.isFinishing()) {
                return false;
            }
        }
        return true;
    }

简单粗暴的方法,直接使用applicationContext(不推荐

Glide.with(mContext.getApplicationContext() 或者 activity.getApplicationContext()) 

参考:https://github.com/bumptech/glide/issues/803

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好,针对 Glide 在 submit 时出现的崩溃问题,可能是因为以下原因: 1. 在调用 `submit()` 方法时,`Target` 对象已经被回收。这可能是因为你在 `Activity` 或 `Fragment` 中使用了匿名内部类作为 `Target` 对象,当 `Activity` 或 `Fragment` 被销毁时,`Target` 对象会被回收,而此时 Glide 还在处理图片,就会出现崩溃。 2. 在调用 `submit()` 方法时,`ImageView` 对象已经被回收。这可能是因为你在 `Activity` 或 `Fragment` 中使用了 `ImageView` 对象,当 `Activity` 或 `Fragment` 被销毁时,`ImageView` 对象会被回收,而此时 Glide 还在处理图片,就会出现崩溃。 下面是可能的解决方案: 1. 你可以使用 `RequestManagerRetriever` 类的 `get()` 方法来获取 `RequestManager` 对象,然后使用 `into()` 方法将 `Target` 对象和 `ImageView` 对象分开设置。这样可以避免匿名内部类的问题。 2. 你可以在 `Activity` 或 `Fragment` 的 `onDestroy()` 方法中,调用 `Glide` 的 `clear()` 方法来清除 Glide 的缓存和资源,避免出现内存泄漏的问题。另外,你也可以在 `ImageView` 对象被回收时,取消 Glide 的加载操作,避免出现崩溃。 例如: ``` // 获取 RequestManager 对象 RequestManager requestManager = Glide.with(context); // 设置 Target 对象 requestManager.load(imageUrl) .into(new CustomTarget<Drawable>() { @Override public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) { // 处理图片 } @Override public void onLoadCleared(@Nullable Drawable placeholder) { // 取消 Glide 的加载操作 requestManager.clear(this); } }); // 设置 ImageView 对象 requestManager.load(imageUrl) .into(new ImageViewTarget<Drawable>(imageView) { @Override protected void setResource(@Nullable Drawable resource) { // 处理图片 } @Override public void onLoadCleared(@Nullable Drawable placeholder) { // 取消 Glide 的加载操作 requestManager.clear(this); } }); ``` 希望这些解决方案对你有所帮助!如果你有其他问题,可以继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值