user5496907
user5496907

Reputation:

Android leaked window

I am trying to display a dialog before finishing the activity. I displayed the dialog and on pressing OK button the activity gets closed. But I am getting a window leak error. Here is my code.

Main Activity

    @Override
    public void onBackPressed(){
         FragmentManager fm = getFragmentManager();
        if (fm.getBackStackEntryCount() > 0) {
            Log.i("MainActivity", "popping backstack");
            fm.popBackStack();
        } else {
            MyAlertDialog dialog=new MyAlertDialog(this);
            dialog.displayDialog("Exit", "Do you wish to exit application?",0);
            super.onBackPressed();
        }
    } 

Dialog Class

public void displayDialog(String title,String message,final int flag)
{
     AlertDialog.Builder builder=new AlertDialog.Builder(context);
     builder.setTitle(title)
         .setMessage(message);
        builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {              
            @Override
            public void onClick(DialogInterface dialog, int which) 
             {
                dialog.dismiss();
                 passIntent(flag);
            }
        });

        builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {              
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

     AlertDialog dialog=builder.create();
    dialog.show();
}


public void passIntent(int flag)
{
    switch(flag)
     {
     case 0:
        ((Activity) context).finish();
        break;
    }
}

Here is my error

11-05 13:48:23.935: E/WindowManager(1353): android.view.WindowLeaked: Activity com.mcommerce.main.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{26da0ed7 V.E..... R.....ID 0,0-480,284} that was originally added here
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:363)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:271)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
11-05 13:48:23.935: E/WindowManager(1353):  at android.app.Dialog.show(Dialog.java:298)
11-05 13:48:23.935: E/WindowManager(1353):  at com.mcommerce.dialog.MyAlertDialog.displayDialog(MyAlertDialog.java:63)
11-05 13:48:23.935: E/WindowManager(1353):  at com.mcommerce.main.MainActivity.onBackPressed(MainActivity.java:256)
11-05 13:48:23.935: E/WindowManager(1353):  at android.app.Activity.onKeyUp(Activity.java:2456)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.KeyEvent.dispatch(KeyEvent.java:2643)
11-05 13:48:23.935: E/WindowManager(1353):  at android.app.Activity.dispatchKeyEvent(Activity.java:2707)
11-05 13:48:23.935: E/WindowManager(1353):  at android.support.v7.internal.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:49)
11-05 13:48:23.935: E/WindowManager(1353):  at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:258)
11-05 13:48:23.935: E/WindowManager(1353):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2276)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4020)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3982)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3544)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3597)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3563)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3680)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3571)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3737)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3544)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3597)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3563)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3571)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3544)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3597)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3563)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3713)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3874)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2208)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1849)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1840)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2185)
11-05 13:48:23.935: E/WindowManager(1353):  at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
11-05 13:48:23.935: E/WindowManager(1353):  at android.os.MessageQueue.nativePollOnce(Native Method)
11-05 13:48:23.935: E/WindowManager(1353):  at android.os.MessageQueue.next(MessageQueue.java:143)
11-05 13:48:23.935: E/WindowManager(1353):  at android.os.Looper.loop(Looper.java:122)
11-05 13:48:23.935: E/WindowManager(1353):  at android.app.ActivityThread.main(ActivityThread.java:5257)
11-05 13:48:23.935: E/WindowManager(1353):  at java.lang.reflect.Method.invoke(Native Method)
11-05 13:48:23.935: E/WindowManager(1353):  at java.lang.reflect.Method.invoke(Method.java:372)
11-05 13:48:23.935: E/WindowManager(1353):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
11-05 13:48:23.935: E/WindowManager(1353):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

I referred many links but still I am not able to solve this issue. Anyone please help. Thanks in advance.

Upvotes: 1

Views: 280

Answers (2)

Rajesh Jadav
Rajesh Jadav

Reputation: 12861

Error:

android.view.WindowLeaked: Activity com.mcommerce.main.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{26da0ed7 V.E..... R.....ID 0,0-480,284} that was originally added here

You are getting this error because Dialog is showing after finishing Activity.

Your dialog will shown and also super.onBackPressed() is called which will finish your Activity.

Try this

MyAlertDialog dialog=new MyAlertDialog(this);
dialog.displayDialog("Exit", "Do you wish to exit application?",0);

instead of

MyAlertDialog dialog=new MyAlertDialog(this);
dialog.displayDialog("Exit", "Do you wish to exit application?",0);
super.onBackPressed();

so Please remove super.onBackPressed() then it will solve your problem.

Upvotes: 0

DmitryArc
DmitryArc

Reputation: 4837

It seems that your problem is caused by the fact that that you leave your Activity at once after showing the Dialog

@Override
public void onBackPressed(){
     FragmentManager fm = getFragmentManager();
    if (fm.getBackStackEntryCount() > 0) {
        Log.i("MainActivity", "popping backstack");
        fm.popBackStack();
    } else {
        MyAlertDialog dialog=new MyAlertDialog(this);
        dialog.displayDialog("Exit", "Do you wish to exit application?",0);
        // super.onBackPressed(); // <-- remove this and implement closing of the activity in the Dialog logic
    }
} 

Upvotes: 1

Related Questions