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.
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!
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With