Android Glide You cannot start a load for a destroyed activity 的异常及解决方法

时间:2025-02-09 09:18:17

Glide 很强大,不再多说。

今天发现了 You cannot start a load for a destroyed activity 这个异常,时因为相关 Activity/Fragment 已经 destroy,而程序代码中依然在使用 Glide 加载图片导致的。抛出异常的方法是在  类里面:

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

出现这个的原因是没有了解 Glide 是与 Activity/Fragment 的生命周期相关联的,这也是为什么 with(this) 有那么多的重载方法。

官方推荐使用下面的方式:

static loadImage(RequestManager glide, String url, ImageView view) {
    (url).into(view);
}

class MyAdapter extends WhichEveryOneYouUse {
    private final RequestManager glide;
    MyAdapter(RequestManager glide, ...) {
         = glide;
        ...
    }
    void getView/onBindViewHolder(... int position) {
        // ... holder magic, and get current item for position
        ... or even loadImage(glide, , );
    }
}

使用的时候:

loadImage((this), url, findViewById());
// or
(new MyAdapter((this), data));

RequestManager 是帮助管理生命周期的,使得 Glide 的生命周期与 Activity/Fragment 保持同步,如果 Activity/Fragment 销毁,相关 Glide 加载也会进行销毁,从而达到不浪费内存的目的,这也是不推荐使用 getApplicationContext() 作为参数的原因。

/questions/31964737/glide-image-loading-with-application-context/32887693#32887693

/bumptech/glide/issues/803