Search code examples
javaandroidandroid-memory

android.view.WindowLeaked error cause of alert dialog


i'm new to android and i have a problem with alert dialog . there is a method like this :

private void deletSelected(){
    AlertDialog.Builder dialog = new AlertDialog.Builder(this);
    dialog.setTitle("are you sure?");
    dialog.setPositiveButton("Yes" , new DialogInterface.OnClickListener(){
        @Override
        public void onClick(DialogInterface dialog, int which) {
            int deletedRow = getContentResolver().delete(
                    ContentUris.withAppendedId(CONTENT_URI , selectedRow) , null , null);

            if (deletedRow == -1){
                Toast.makeText(EditorActivity.this , "not deleted!" , Toast.LENGTH_SHORT).show();
            }else {
                Toast.makeText(EditorActivity.this , "deleted successfully" , Toast.LENGTH_SHORT).show();
            }
            if (dialog != null){
                dialog.dismiss();
            }    
        }
    });
    dialog.setNegativeButton("no" , new DialogInterface.OnClickListener(){
        @Override
        public void onClick(DialogInterface dialog, int which) {
            if (dialog != null){
                dialog.dismiss();
            }
        }
    });
    // Create and show the AlertDialog
    AlertDialog alertDialog = dialog.create();
    alertDialog.show();
}

and a second method like this:

 @Override
public boolean onOptionsItemSelected(MenuItem item) {
    // User clicked on a menu option in the app bar overflow menu
    switch (item.getItemId()) {
        // Respond to a click on the "Save" menu option
        case R.id.action_save:
            save();
            finish();
            return true;
        // Respond to a click on the "Delete" menu option
        case R.id.action_delete:
            deletSelected();
            finish(); // if i remove this line app will work correctly
            return true;
    }
    return super.onOptionsItemSelected(item);
}

my problem is that if i remove finish() in onOptionsItemSelected method my app will run correctly but it remain in current activity which i don't want . i want after user press yes in confirmation dialog selected row in dataBase delete and back to main activity but without this line selected row will delete but app doesn't back to mainActivity .

and if i add finish() the confirmation dialog disappear immediately after clicking delete and app will back to main activity without deleting anything . and in logical the following error shows:

08-04 21:57:02.630 28064-28064/com.example.android.pets E/WindowManager: android.view.WindowLeaked: Activity com.example.android.pets.EditorActivity has leaked window android.widget.PopupWindow$PopupDecorView{652e345 V.E...... ......ID 0,0-588,144} that was originally added here
                                                                         at android.view.ViewRootImpl.<init>(ViewRootImpl.java:394)
                                                                         at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:330)
                                                                         at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
                                                                         at android.widget.PopupWindow.invokePopup(PopupWindow.java:1279)
                                                                         at android.widget.PopupWindow.showAsDropDown(PopupWindow.java:1118)
                                                                         at android.support.v7.widget.AppCompatPopupWindow.showAsDropDown(AppCompatPopupWindow.java:105)
                                                                         at android.support.v4.widget.PopupWindowCompatKitKat.showAsDropDown(PopupWindowCompatKitKat.java:33)
                                                                         at android.support.v4.widget.PopupWindowCompat$KitKatPopupWindowImpl.showAsDropDown(PopupWindowCompat.java:129)
                                                                         at android.support.v4.widget.PopupWindowCompat.showAsDropDown(PopupWindowCompat.java:206)
                                                                         at android.support.v7.widget.ListPopupWindow.show(ListPopupWindow.java:721)
                                                                         at android.support.v7.view.menu.StandardMenuPopup.tryShow(StandardMenuPopup.java:160)
                                                                         at android.support.v7.view.menu.StandardMenuPopup.show(StandardMenuPopup.java:187)
                                                                         at android.support.v7.view.menu.MenuPopupHelper.showPopup(MenuPopupHelper.java:290)
                                                                         at android.support.v7.view.menu.MenuPopupHelper.tryShow(MenuPopupHelper.java:175)
                                                                         at android.support.v7.widget.ActionMenuPresenter$OpenOverflowRunnable.run(ActionMenuPresenter.java:803)
                                                                         at android.os.Handler.handleCallback(Handler.java:743)
                                                                         at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                         at android.os.Looper.loop(Looper.java:150)
                                                                         at android.app.ActivityThread.main(ActivityThread.java:5546)
                                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
                                                                         at     com.android.internal.os.ZygoteInit.main(ZygoteInit.java:682)
 08-04 21:57:02.631 28064-28064/com.example.android.pets E/WindowManager:      android.view.WindowLeaked: Activity com.example.android.pets.EditorAc

any idea ?

EDIT: after removing finish() and place it in onClick method . everything is correct now . but i can't understand what is the difference between this two way ?


Solution

  • Try passing the activity that you want to finish into the deletSelected() method and call the activity.finish() from onClick(), instead of calling finish() from where you currently have.