使用警报对话框关闭应用程序时出错

时间:2014-06-13 13:23:06

标签: android android-dialog

logcat的:

06-13 18:25:37.534: E/WindowManager(420): Activity com.dimensionsco.thankbunny.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@43ef3c98 that was originally added here

这是我用于通过警告对话框退出应用程序的代码。但它最终会出错。我不明白我哪里出错了。我在模拟器上运行它。谁能解决这个问题?提前致谢

@Override
public void onStop() {
    super.onStop();
    Toast.makeText(getBaseContext(), "stop", Toast.LENGTH_LONG).show();
    AlertDialog.Builder alertDialogBuilde = new AlertDialog.Builder(MainActivity.this);
    alertDialogBuilde.setTitle(this.getTitle() + "EXIT");
    alertDialogBuilde.setMessage("DO you want to exit?");
    AlertDialog alertDialogr = alertDialogBuilde.create();

    alertDialogBuilde.setPositiveButton("Yes", new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int id) {

            // go to a new activity of the app
            dialog.cancel();
            // finish();
        }

    });

    alertDialogBuilde.setNegativeButton("No", new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int id) {
            dialog.cancel();

        }
    });

    // set neutral button: Exit the app message
    alertDialogBuilde.setNeutralButton("Exit the app", new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int id) {
            // exit the app and go to the HOME
            System.exit(0);
            // MainActivity.this.finish();
        }
    });

    alertDialogr.show();
}

3 个答案:

答案 0 :(得分:2)

您无法在onStop()中创建用户界面或与用户互动。请参阅Activity Lifecycle documentation。在执行onStop()时,活动已经不可见并且正在被释放,因此您无论如何都无法中断该过程。更糟糕的是,如果你可以在这里互动,那么你的finish()会再次调用onStop() ......

如果您需要拦截用户启动的退出,请覆盖onBackPressed()并在那里提示您的对话框。

请注意,由于各种原因(包括拨打电话),活动可能会暂停和停止。您当然不希望用户必须确认您的提示才能接听他的电话......

答案 1 :(得分:0)

您可以在此处从对话框中完成活动,但警报不会被破坏,因此会泄漏。您需要先关闭对话框,然后完成活动。

alertDialogBuilde.setNeutralButton("Exit the app", new DialogInterface.OnClickListener() {

    public void onClick(DialogInterface dialog, int id) {
        // exit the app and go to the HOME
        System.exit(0);
        // MainActivity.this.finish();
    }
});

答案 2 :(得分:-2)

System.exit(0)不是关闭活动的好主意,而是调用finish(); System.exit调用垃圾收集器,然后除了垃圾回收器之外别无其他。所有其他正在运行的进程将在gc期间暂停。该方法仅应用于非常必要的原因。

但是,请发布完整的Logcat输出,以便这里的人可以准确地看到发生了什么。也许我们需要查看更多代码,以了解问题所在。

无论如何,这个错误发生的原因可能是,你没有在完成之前关闭你的对话框。所以你必须做以下事情:

alertDialogBuilde.setNeutralButton("Exit the app", new DialogInterface.OnClickListener() {

    public void onClick(DialogInterface dialog, int id) {
        // exit the app and go to the HOME
        dialog.cancel();
        finish();
        // MainActivity.this.finish();
    }
});