Alertdialog создает исключение в android

Я использую Alert-dialog в Asynchronous task onPostexecute method.but, моя проблема в том, когда я возвращаюсь к предыдущему действию до завершения асинхронной задачи. Alertdialog (alert.show) предоставляет следующее исключение. Alertdialog появится на но почему это не отображается на других экранах, когда я возвращаюсь назад.

Ошибка 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 [email protected] 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();
        }

Ответ 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

Вы пытаетесь показать диалог после того, как ваша активность потеряла видимость. Вам либо не нужно вызывать показ (который может быть PITA поймать), либо вам нужно поймать это исключение и обеспечить разумное поведение для вашего приложения. Я вообще просто поймал исключение, но это может быть или не быть достаточным для вас.

Ответ 4

вы должны вызвать alertdialog на onprogressupate mtd в качестве своего вызова в основном потоке.

Ответ 5

Возможная причина - контекст диалогового окна предупреждения. Вы можете завершить эту деятельность, чтобы ее попытка открыть в этом контексте, но которая уже закрыта. Попытайтесь изменить контекст этого диалога на первую операцию, потому что она не будет закончена до конца.

Попробуйте ввести код например

вместо этого.

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

попробуйте использовать

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