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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值