使用 Glide 从 URL 加载图像时出现 IllegalArgumentException?
IllegalArgumentException when loading Image from URL with Glide?
我的开发控制台收到很多崩溃报告,其中包含以下错误消息:
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.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 版本和设备上。
谁能告诉我如何解决这个问题?
编辑
这是在 MainActivity:
的 onCreate 中在 App 启动时调用的完整函数
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 处于 onPause 而崩溃?是因为另一个 Activity 还是插页式广告或奖励视频广告?
它只在一小部分用户设备上崩溃,而且用户也不需要显示对话框,它只是我用来宣传我自己的应用程序的对话框。
是否可以在 Glide 语句周围包装一个简单的 try and catch blocka 以便它被捕获并且不会崩溃?
您正在 UI 线程中创建 new Handler
,该线程等待 120 秒并且永远不会被关闭。您的代码在 Activity
被销毁后触发并导致 Toast
或 finish
调用 null
Context
(死 Activity
)
在 class 之上声明你 Handler
并在 Context
(或 Thread
)被销毁时总是调用 handler.removeCallbacksAndMessages(null);
,例如对于 Activity
它将是 onDestroy
方法,在 super
调用
之前
我的开发控制台收到很多崩溃报告,其中包含以下错误消息:
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.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 版本和设备上。
谁能告诉我如何解决这个问题?
编辑 这是在 MainActivity:
的 onCreate 中在 App 启动时调用的完整函数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 处于 onPause 而崩溃?是因为另一个 Activity 还是插页式广告或奖励视频广告?
它只在一小部分用户设备上崩溃,而且用户也不需要显示对话框,它只是我用来宣传我自己的应用程序的对话框。 是否可以在 Glide 语句周围包装一个简单的 try and catch blocka 以便它被捕获并且不会崩溃?
您正在 UI 线程中创建 new Handler
,该线程等待 120 秒并且永远不会被关闭。您的代码在 Activity
被销毁后触发并导致 Toast
或 finish
调用 null
Context
(死 Activity
)
在 class 之上声明你 Handler
并在 Context
(或 Thread
)被销毁时总是调用 handler.removeCallbacksAndMessages(null);
,例如对于 Activity
它将是 onDestroy
方法,在 super
调用