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

Glide 很强大,不再多说。

今天发现了 You cannot start a load for a destroyed activity 这个异常,时因为相关 Activity/Fragment 已经 destroy,而程序代码中依然在使用 Glide 加载图片导致的。抛出异常的方法是在 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");
    }
}

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

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

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

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

使用的时候:

loadImage(Glide.with(this), url, findViewById(R.id.image));
// or
list.setAdapter(new MyAdapter(Glide.with(this), data));

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

http://stackoverflow.com/questions/31964737/glide-image-loading-with-application-context/32887693#32887693

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



你可能感兴趣的:(Android随记)