Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Activity has leaked window at alertDialog show() method

I am getting window leak error at runtime because of using an AlertDialog.

I have pointed out the error line in the code below:

Stacktrace:

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          }      }    } 

I don't know how to solve this issue.

like image 991
Steve Avatar asked Aug 18 '15 07:08

Steve


2 Answers

You get error because ProgressDialog is running while your Activity is destroyed. You should dismiss dialog before starting new 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);   } }); 

I hope it helps!

like image 76
Rajesh Avatar answered Sep 17 '22 02:09

Rajesh


Dismiss the alertDialog in onPause() method. i.e. call alertDialog.dismiss()

Note : WindowLeaked exceptions are occured usually if dialogs are not dismissed before Activity is ended.

like image 30
N Kaushik Avatar answered Sep 20 '22 02:09

N Kaushik