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