【问题标题】:Alertdialog creating exception in android在android中创建异常的Alertdialog
【发布时间】:2013-02-27 05:13:56
【问题描述】:

我在异步任务 onPostexecute 方法中使用警报对话框。但我的问题是当我在异步任务完成之前回到以前的活动时。警报对话框(alert.show)给出以下异常。警报对话框将出现在窗口,但是为什么当我切换回来时它没有显示在其他屏幕上。

Logcat 错误:

02-27 05:03:05.283: E/AndroidRuntime(827): FATAL EXCEPTION: main
02-27 05:03:05.283: E/AndroidRuntime(827): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@40f25058 is not valid; is your activity running?
02-27 05:03:05.283: E/AndroidRuntime(827):  at android.view.ViewRootImpl.setView(ViewRootImpl.java:567)
02-27 05:03:05.283: E/AndroidRuntime(827):  at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:246)
02-27 05:03:05.283: E/AndroidRuntime(827):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
02-27 05:03:05.283: E/AndroidRuntime(827):  at android.app.Dialog.show(Dialog.java:281)
02-27 05:03:05.283: E/AndroidRuntime(827):  at android.app.AlertDialog$Builder.show(AlertDialog.java:951)
02-27 05:03:05.283: E/AndroidRuntime(827):  at com.example.parentportal.Email$emailtask.onPostExecute(Email.java:119)
02-27 05:03:05.283: E/AndroidRuntime(827):  at com.example.parentportal.Email$emailtask.onPostExecute(Email.java:1)
02-27 05:03:05.283: E/AndroidRuntime(827):  at android.os.AsyncTask.finish(AsyncTask.java:631)
02-27 05:03:05.283: E/AndroidRuntime(827):  at android.os.AsyncTask.access$600(AsyncTask.java:177)
02-27 05:03:05.283: E/AndroidRuntime(827):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
02-27 05:03:05.283: E/AndroidRuntime(827):  at android.os.Handler.dispatchMessage(Handler.java:99)
02-27 05:03:05.283: E/AndroidRuntime(827):  at android.os.Looper.loop(Looper.java:137)
02-27 05:03:05.283: E/AndroidRuntime(827):  at android.app.ActivityThread.main(ActivityThread.java:5039)
02-27 05:03:05.283: E/AndroidRuntime(827):  at java.lang.reflect.Method.invokeNative(Native Method)
02-27 05:03:05.283: E/AndroidRuntime(827):  at java.lang.reflect.Method.invoke(Method.java:511)
02-27 05:03:05.283: E/AndroidRuntime(827):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
02-27 05:03:05.283: E/AndroidRuntime(827):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
02-27 05:03:05.283: E/AndroidRuntime(827):  at dalvik.system.NativeStart.main(Native Method)

代码

 Context mContext = Email.this;
               AlertDialog.Builder alert = new AlertDialog.Builder(mContext);

               alert.setTitle("");
               WebView wv = new WebView(mContext);
               String html = "<h3>Message has been sent successfully</h3>";

               wv.loadData(html, "text/html", "UTF-8");
               alert.setView(wv);
//             alert.setPositiveButton("Yes", new DialogInterface.OnClickListener(){
//                public void onClick(DialogInterface dialog, int id){
//                 
//                }
//             });
               alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
                  public void onClick(DialogInterface dialog, int id){

                  }
               });
               alert.show();
        }

【问题讨论】:

  • 你能贴出你的Dialog代码吗
  • 请发布您的对话框代码
  • 尝试在您的 postexecute 方法中运行 on runonUIthread 中显示alerdialog 的代码。
  • 你的对话代码是用onPostExecute方法写的吗?

标签: android exception android-alertdialog


【解决方案1】:

问题是因为在 onPostExecute() 中,您有警报对话框,并且您正在提供电子邮件活动的上下文。但是您正在导航到其他活动,因此上下文是错误的。因此,您会收到此错误!

最好在异步任务执行完成后显示进度并允许用户导航。如果您希望它在后台运行,请使用服务。

【讨论】:

    【解决方案2】:

    尝试如下:

       AlertDialog.Builder alert = new AlertDialog.Builder(Email.this);
            alert.setTitle("");
               WebView wv = new WebView(Email.this);
               String html = "<h3>Message has been sent successfully</h3>";
               wv.loadData(html, "text/html", "UTF-8");
               alert.setView(wv);
          // alert.setPositiveButton("Yes", new DialogInterface.OnClickListener(){
          //public void onClick(DialogInterface dialog, int id){
          //}
           //});
               alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
                  public void onClick(DialogInterface dialog, int id){
                  }
               });
            AlertDialog builder = alert.create();
        builder.show();
    

    【讨论】:

      【解决方案3】:

      您正在尝试在您的活动失去可见性后显示一个对话框。您要么不需要调用 show(可以是要捕获的 PITA),要么需要捕获该异常并为您的应用程序提供合理的行为。我通常刚刚发现了异常,但这对你来说可能还不够。

      【讨论】:

        【解决方案4】:

        您必须调用 onprogressupate mtd 上的 alertdialog 作为它在主线程上的调用。

        【讨论】:

        • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
        【解决方案5】:

        可能的原因是警报对话框的上下文。您可能已完成该活动,因此它试图在该上下文中打开但已关闭。尝试将该对话框的上下文更改为您的第一个活动,因为它要到最后才会完成。

        试试下面的代码 例如

        而不是这个。

             AlertDialog alertDialog = new AlertDialog.Builder(this).create();
        

        尝试使用

            AlertDialog alertDialog = new AlertDialog.Builder(FirstActivity.getInstance()).
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多