web-dev-qa-db-fra.com

Une fenêtre a fui dans la méthode alertDialog show ()

Je reçois une erreur de fuite de fenêtre au moment de l'exécution à cause de l'utilisation d'un AlertDialog.

J'ai signalé la ligne d'erreur dans le code ci-dessous:

Trace de la pile:

08-18 02:48:04.489  28893-28893/? E/WindowManager﹕ Activity com.ms.ha.fragment.FirstActivity has leaked window com.Android.internal.policy.impl.PhoneWindow$DecorView{52e58540 V.E..... R.....ID 0,0-1026,585} that was originally added here
    Android.view.WindowLeaked: Activity com.ms.ha.fragment.FirstActivity has leaked window com.Android.internal.policy.impl.PhoneWindow$DecorView{52e58540 V.E..... R.....ID 0,0-1026,585} that was originally added here
            at Android.view.ViewRootImpl.<init>(ViewRootImpl.Java:345)
            at Android.view.WindowManagerGlobal.addView(WindowManagerGlobal.Java:239)
            at Android.view.WindowManagerImpl.addView(WindowManagerImpl.Java:69)
            at Android.app.Dialog.show(Dialog.Java:281)
            at com.ms.ha.fragment.TourGuideLoadURLFragment$WebAppInterface.moveToNextScreen(TourGuideLoadURLFragment.Java:116)
            at Android.webkit.WebViewCore.nativeMouseClick(Native Method)
            at Android.webkit.WebViewCore.nativeMouseClick(Native Method)
            at Android.webkit.WebViewCore.access$6800(WebViewCore.Java:59)
            at Android.webkit.WebViewCore$EventHub.dispatchWebKitEvent(WebViewCore.Java:1793)
            at Android.webkit.WebViewInputDispatcher.dispatchWebKitEvent(WebViewInputDispatcher.Java:689)
            at Android.webkit.WebViewInputDispatcher.dispatchWebKitEvents(WebViewInputDispatcher.Java:639)
            at Android.webkit.WebViewInputDispatcher.access$800(WebViewInputDispatcher.Java:78)
            at Android.webkit.WebViewInputDispatcher$WebKitHandler.handleMessage(WebViewInputDispatcher.Java:1153)
            at Android.os.Handler.dispatchMessage(Handler.Java:99)
            at Android.os.Looper.loop(Looper.Java:137)
            at Android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.Java:814)
            at Java.lang.Thread.run(Thread.Java:841)

FirstActivity.Java:

 public class FirstActivity extends FragmentActivity  implements View.OnClickListener{

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.fragment_tour_guide_web);
  .......
  .......

   webView.addJavascriptInterface(new WebAppInterface(this), "Android");

 }


    public class WebAppInterface {
        Context mContext;

        /**
         * Instantiate the interface and set the context
         */
        WebAppInterface(Context c) {
            mContext = c;
        }

        /**
         * Intent - Move to next screen
         */

        @JavascriptInterface
        public void moveToNextScreen() {
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                    context);

            // set title
            alertDialogBuilder.setTitle("Your Title");

            // set dialog message
            alertDialogBuilder
                    .setMessage("Click yes!")
                    .setCancelable(false)
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {

                            Intent i = new Intent(FirstActivity.this,SecondActivity.class);
                            startActivity(i);
                        }
                    })
                    .setNegativeButton("No", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            // if this button is clicked, just close
                            // the dialog box and do nothing
                            dialog.cancel();
                        }
                    });

            // create alert dialog
            AlertDialog alertDialog = alertDialogBuilder.create();

            // show it
            alertDialog.show();  --->leak window error

        }

    }

  }

Je ne sais pas comment résoudre ce problème. 

18
Steve

Vous obtenez une erreur car ProgressDialog est en cours d'exécution pendant que votre Activity est détruit. Vous devriez fermer la boîte de dialogue avant de commencer une nouvelle Activity.

.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
  public void onClick(DialogInterface dialog, int id) {
      if (alertDialog != null && alertDialog.isShowing()) {
          alertDialog.dismiss();
      }
      Intent i = new Intent(FirstActivity.this, SecondActivity.class);
      startActivity(i);
  }
});

J'espère que ça aide!

39
Rajesh

Annulez le alertDialog dans la méthode onPause (). c'est-à-dire appeler alertDialog.dismiss ()

Remarque: des exceptions WindowLeaked se produisent généralement si les boîtes de dialogue ne sont pas fermées avant la fin de l'activité.

9
codevscolor

Vous devez avoir besoin de fermer/annuler votre dialogue une fois l’activité terminée. Cela se produit généralement si les dialogues ne sont pas fermés avant la fin de l'activité.

2
Daud Arfin

Vous pouvez également obtenir une exception WindowLeaked si vous n'êtes pas dans le fil de l'interface utilisateur lorsque vous essayez d'afficher la boîte de dialogue. Solution facile:

this.runOnUiThread(new Runnable() {
    @Override
    public void run() {
        // show dialog here
    }
});
0
ScottyB