Android 使用Glide从URL加载图像时出现IllegalArgumentException?
我在我的开发控制台中收到很多崩溃报告,其中包含以下错误消息:Android 使用Glide从URL加载图像时出现IllegalArgumentException?,android,debugging,crash,android-glide,illegalargumentexception,Android,Debugging,Crash,Android Glide,Illegalargumentexception,我在我的开发控制台中收到很多崩溃报告,其中包含以下错误消息: java.lang.IllegalArgumentException: at com.bumptech.glide.manager.RequestManagerRetriever.assertNotDestroyed (RequestManagerRetriever.java:317) at com.bumptech.glide.manager.RequestManagerRetriever.get (RequestMana
java.lang.IllegalArgumentException:
at com.bumptech.glide.manager.RequestManagerRetriever.assertNotDestroyed (RequestManagerRetriever.java:317)
at com.bumptech.glide.manager.RequestManagerRetriever.get (RequestManagerRetriever.java:128)
at com.bumptech.glide.manager.RequestManagerRetriever.get (RequestManagerRetriever.java:108)
at com.bumptech.glide.Glide.with (Glide.java:776)
at com.mypackagename.censored.GlobalBanner$7.run (GlobalBanner.java:241)
at android.os.Handler.handleCallback (Handler.java:888)
at android.os.Handler.dispatchMessage (Handler.java:100)
at android.os.Looper.loop (Looper.java:213)
at android.app.ActivityThread.main (ActivityThread.java:8178)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1101)
GlobalBanner.java:241是:
ImageView imageView = dialog.findViewById(R.id.dialog);
RequestOptions options = new RequestOptions()
.placeholder(R.drawable.globaldialog_placeholder)
.error(R.drawable.globaldialog_failedtoload);
Glide.with(mContext).load(imageURLGlobal).apply(options).into(imageView ); //This is Line 241
该代码在我所有的设备和模拟器上都能工作,它加载了一个540 x 722 JPG,并在应用程序中以对话框的形式显示。图像大小为182 KB
我真的没有更多的信息,错误发生在许多不同的Android版本和设备上
有人能给我解释一下我该怎么解决这个问题吗
编辑
以下是在onCreate MainActivity的应用程序启动时调用的完整函数:
public static void setGlobalBanner(final Context mContext) {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (isDislayingGlobal == 1) {
final Dialog dialog = new Dialog(mContext);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setCancelable(true);
dialog.setContentView(R.layout.dialog_global_banner);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
dialog.getWindow().setDimAmount(0.5f);
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.copyFrom(dialog.getWindow().getAttributes());
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
dialog.getWindow().setAttributes(lp);
ImageView dialogButton1 = dialog.findViewById(R.id.button_close);
dialogButton1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
dialog.dismiss();
}
});
ImageView imageView = dialog.findViewById(R.id.dialogImage);
RequestOptions options = new RequestOptions()
.placeholder(R.drawable.globaldialog_placeholder)
.error(R.drawable.globaldialog_failedtoload);
Glide.with(mContext).load(imageURLGlobal).apply(options).into(imageView);
imageView .setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
mContext.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(playstorelinkGlobal)));
dialog.dismiss();
}
});
dialog.show();
}
}
}, displayingSecondsGlobal);
}
displaysecondsGlobal正在从我的数据库中提取,是对话框在显示之前应该等待的秒数,通常是120秒。
是否可能因为MainActivity处于暂停状态而崩溃?因为另一个活动,或者可能是插播或回赠视频广告
它只在一小部分用户设备上崩溃,而且用户也不需要显示对话框,它只是我用来宣传自己应用程序的对话框。
是否可以在Glide语句中封装一个简单的try-and-catch-blocka,这样它就可以被捕获而不会崩溃?您正在UI线程中创建一个新的处理程序,该处理程序等待120秒,并且永远不会被解除。您的代码在
活动
被销毁并导致Toast
或finish
调用null
上下文
(死活动
)
在类顶部声明您的
Handler
,并始终调用Handler.removeCallbacksAndMessages(null)代码>当上下文
(或线程
)被销毁时,例如对于活动
它将是onDestroy
方法,在超级
调用调用此请求时,您能否发布AssertNotDistromed
表明RequestManagerRetriever
可能为空,可能被另一个/UI线程破坏?@snachmsm我发布了整个函数,它在创建时在Main活动中被调用,但处理程序等待120秒,直到超过Glide代码,当用户打开另一个活动或观看奖励视频广告时,可能会崩溃?因为调用了MainActivity的onPause?所以在顶部声明处理程序应该可以解决这个问题?公共经办人;正在放置handler.removeCallbacksAndMessages(null);在onDestroy中,修复此崩溃或只是一个好的做法很重要?这两者都很重要,当不再需要时,您应该始终清除发布到处理程序的消息,否则您可能会出现一些内存泄漏,在这种情况下,您可能会出现内存泄漏。即使活动
被销毁处理程序
仍然存在于内存中,并且在某个时刻试图执行一些与活动
相关的代码(该代码已消失)