首页 > 编程语言 >Android Error: java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity

Android Error: java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity

时间:2022-11-29 18:34:40浏览次数:41  
标签:lang load java Glide glide context activity 加载


一:Glide有时会出现这样的异常:

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.Glide.with(Glide.java:653)

原因是:

        当你的Activity重新创建并且Glide中的context是旧的时,这个问题最容易发生。例如当你有一个CustomAdapter(ArrayList list, Context context),并且在MainActivity或Fragment重新创建时,你不会将新的context传递给适配器。然后Glide告诉你我正在使用的context对象不再存在。 

        假如你在一个页面的adapter中加载了100个图片,没加载完finish了,下次再进这个页面会根据缓存在上个acitvity地址加载图片,但上个地址已经被干掉了(finish)。


二:解决方案:

2.1 使用控件的context代替我们传递给adapter的context:

Glide.with(holder.itemView.getContext())
.load(URL)
.skipMemoryCache(true)
.placeholder(R.drawable.bg_loading_small)
.error(R.drawable.bg_loading_small)
.into(nativeAdContentImg)

但经过测试,这样做还是不能根本解决问题,有时还是会出现这个异常导致崩溃:最终经过测试发现getApplicationContext()代替掉context比较稳妥

Glide.with(getApplicationContext())
.load(URL)
.skipMemoryCache(true)
.placeholder(R.drawable.bg_loading_small)
.error(R.drawable.bg_loading_small)
.into(nativeAdContentImg)

但是 glide加载图片如果用applicationContext的话,会出现当你离开这个页面时,图片的下载工作还在进行,会造成多余的资源消耗,所以可以这样处理,

// 重写activity的onDestroy()方法,停止该页面的glide的加载请求
@override
protected void onDestroy() {
super.onDestroy();
Glide.with(getApplicationContext()).pauseRequests();
}

如果是在actiity中做glide加载的话,可以做如下判断:

 

if (!YourActivity.this.isFinishing()) {
Glide.with(YourActivity.this)
.load(URL)
...
}

2.2 在每次加载图片的时候判断一下context是否为空 

final Context  context = getContext();
if (isValidContextForGlide(context) {
// Load image via Glide lib using context
}

public static 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;
}

 

 

标签:lang,load,java,Glide,glide,context,activity,加载
From: https://blog.51cto.com/u_12853553/5896521

相关文章

  • 2022-11-29Java学习
    1.面向对象的三大特征:封装,继承,多态。 2.staticstatic:静态修饰符,用于修饰成员变量和成员函数特点:(1)要共享这个对象,用static修饰;(2)被static修饰的成员可以直接被类名调......
  • java多线程模型
    一、线程状态:  新建状态(New):新创建了一个线程对象。就绪状态(可执行状态,Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,......
  • 力扣240(java&python)-搜索二维矩阵 II(中等)
    题目:编写一个高效的算法来搜索 m x n 矩阵matrix中的一个目标值target。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例......
  • javascript 高级编程系列 - 字符串
    1.字符串中的方法matchstr.match(reg)参数:一个正则表达式对象,如果reg不是正则表达式对象,则会利用newRegExp(reg)隐式转换。返回值:1.正则表达式中如果有g标志......
  • Java基础-scanner的使用
    在类的声明之前,引入扫描仪(Scanner):importjava.util.Scanner;在方法中创建一个扫描仪 Scannerinput=newScanner(System.in);通过扫描仪获取从键盘输入的数据 inti......
  • javaweb3
    5.Cookie5.1介绍Cookie是在web浏览器访问web服务器上的某个资源时,由web服务器在响应浏览器通过响应头附带的传送给浏览器并存储在浏览器端的一小段数据5.2使用创......
  • 均值滤波及中值滤波(Java)
    既然要滤波,先添加点噪点:publicstaticBMPImageAddNoise(BMPImageimg){BMPImageimg2=newBMPImage(img.width,img.height);for(inti=1;i<img.hei......
  • java小工具util系列8:JSONObject获取key
    场景问题:JSONObject获取所有的key解决方案技巧:JSONObject获取key:↓JSONObjectobj;for(Map.Entry<String,Object>entry:cutReceiveAlarmMessageObject.entrySet......
  • 1、引入Javascript的几种方式
    <scripttype="text/javascript">window.alert("hellojs");//alert函数会阻塞整个页面加载的作用,当我们把script放到最前面//当alert按......
  • 幂等——Java基础api设计
    幂等什么是幂等幂等性:****多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。使用幂等的场景1.前端重复提交在用户注册、用户创建商......