【问题标题】:IllegalArgumentException when loading Image from URL with Glide?使用 Glide 从 URL 加载图像时出现 IllegalArgumentException?
【发布时间】:2021-04-05 22:51:31
【问题描述】:

我在开发控制台中收到很多包含此错误消息的崩溃报告:

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 版本和设备上。

谁能告诉我如何解决这个问题?

编辑 这是在 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 还是因为 Interstitial 或 RewardedVideo 广告?

它只在一小部分用户设备上崩溃,而且用户不需要显示对话框,它只是我用来宣传我自己的应用程序的一个对话框。 是否可以在 Glide 语句周围包装一个简单的 try 和 catch 块,使其被捕获并且不会崩溃?

【问题讨论】:

  • 您可以在调用此请求时发帖吗? assertNotDestroyed 暗示RequestManagerRetriever 可能为空,可能被另一个/UI 线程销毁?
  • @snachmsm 我发布了整个函数,它在 MainActivity onCreate 中被调用,但处理程序等待 120 秒直到它执行 Glide 代码,也许它在用户打开另一个活动或观看奖励视频时崩溃广告?因为 MainActivity 的 onPause 被调用了?

标签: android debugging crash android-glide illegalargumentexception


【解决方案1】:

您正在 UI 线程中创建 new Handler,该线程等待 120 秒并且永远不会被解雇。你的代码在Activity 被销毁并导致Toastfinish 调用null Context 后触发(死Activity

在课堂上声明您Handler,并在Context(或Thread)被销毁时始终调用handler.removeCallbacksAndMessages(null);,例如对于Activity,它将是onDestroy 方法,在super 调用之前

【讨论】:

  • 那么在顶部声明处理程序应该可以解决这个问题吗?公共处理程序处理程序;正在放置 handler.removeCallbacksAndMessages(null);在 onDestroy 中对修复此崩溃很重要还是只是一个好的做法?
  • 两者兼而有之,当不再需要发送到Handler 的消息时,您始终应该清除它们,否则您可能会遇到一些内存泄漏,在这种情况下您可能会遇到一个。即使Activity 被销毁Handler 仍然存在于内存中,并且在某个时刻试图执行一些与Activity 相关的代码(已经消失)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
相关资源
最近更新 更多