在捕获异常时在Android中显示自定义AlertDialog

时间:2011-05-05 14:47:19

标签: android exception dialog alert alertdialog

我正在尝试为catch块中的用户显示警告消息。不同之处在于我的try / catch位于主活动的onCreate()内,因此只要应用程序打开就会执行。

我已尝试过此操作(我在活动结尾处有一个OnClick()用于dialog.dismiss()this.finish()之后的对话:

 catch (SQLException e) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this)
        .setTitle(getString(R.string.label_title_error))
        .setIcon(R.drawable.error_icon)
        .setMessage(getString(R.string.msg_error_sql))
        .setPositiveButton(getString(R.string.label_ok), this);

        AlertDialog dialogSQL = builder.create();
        dialogSQL.show();

        e.printStackTrace();
    }

我也试过这个:

   catch (NumberFormatException e) {
        AlertDialog.Builder dialog = new AlertDialog.Builder(this);
        dialog.setTitle(getString(R.string.label_title_error));
        dialog.setIcon(R.drawable.error_icon);
        dialog.setMessage(getString(R.string.msg_error_numberformat));
        dialog.setNeutralButton(getString(R.string.label_ok), null);

        dialog.create().show();

        e.printStackTrace();
    }

在调试时强制异常,我可以看到它只是捕获异常,显示在LogCat中(作为警告)并保持流程直到它遇到另一个未处理的异常,然后显示默认的“抱歉!/强制关闭” Android对话框。并且LogCat中没有与对话框相关的其他异常。

为什么它不会为catch显示我的自定义AlertDialogs?我考虑过Builder需要的上下文,但是如果来自super()的{​​{1}}在此代码之前,为什么它会显示消息?

谢谢大家。

更新:好的,按照要求,这里有更多的代码。

onCreate()

}

2 个答案:

答案 0 :(得分:1)

AlertDialog通常需要其父上下文才能正常工作(根据我的经验;如果我错了,有人会纠正我)。除非出现其他错误(如果没有完整的代码,很难说出来),如果将其移到onResume()函数中,你可能会正常工作。

答案 1 :(得分:0)

这是活动生命周期的一个问题!

这就是我的所作所为:

        } catch (NumberFormatException e) {
        showDialog(
                R.string.label_title_error, 
                R.drawable.error_icon, 
                R.string.msg_error_noservice, 
                R.string.label_ok);
        error = true;
        e.printStackTrace();

    }

和此:

    @Override
protected void onResume() {
    Log.v("FLUXO", "PIN -->> ON RESUME");
    super.onResume();
    if (!error) {
        if (!facade.isInitialized(serviceNames[0], this)) {
            Intent itInicial = new Intent(this, InitialActivity.class);
            startActivityForResult(itInicial, INSERT_SAL);
        }       

    }
}