【问题标题】:What is the best way to stop an activity and alert the user?停止活动并提醒用户的最佳方式是什么?
【发布时间】:2011-04-07 02:51:36
【问题描述】:

我有一个必须创建数据库的应用程序,如果失败了,那么前进就没有意义了。我已经建立了一个 AlertDialog 和 show() 它,但它从不显示。由于缺少数据库,逻辑失败然后失败。

抛出消息并停止活动的正确/最佳方式是什么?下面的代码执行得很好(意味着show() 在调试时出现,它掉到下一行),但 UI 永远不会显示此警报。顺便说一句 - 我意识到投掷可能不是最优雅的,但我什至没有走那么远……B^)。

try {

    myDBHelp.createDataBase();
} catch (IOException ioe) {
    new AlertDialog.Builder(this).setCancelable(false)
        .setMessage(ioe.getMessage())
        .setTitle("Database Create Failed")
        .setPositiveButton("Quit", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                throw new Error("Unable to create database - please try uninstall/reinstall");
            }
         })
         .show();

【问题讨论】:

    标签: android terminate android-alertdialog


    【解决方案1】:

    我不知道你用的是什么流量。但是有一个建议 你可以这样做。

    你可以像这样开始数据库操作..

    Intent i = new Intent(this,Databaseoperation.class); 开始活动(一); ................................... 这将使控件移动到数据库操作类 它执行各种操作,如 open.close、insert delete..等。

    你可以在内置类中扩展databasehelper

    现在,当打开数据库或任何东西出现任何问题时, 完成()意图并返回主要活动......

    你可以这样..

    感谢拉克什

    【讨论】:

    • Rakesh - 问题不在于捕获错误。它让用户知道出了什么问题,并防止无用代码的出现和崩溃。我想知道使用 Intent 是否只会让情况变得更糟——实际上我想阻止/等待它完成——没有数据库,没有应用程序。
    【解决方案2】:

    我通常会这样做:

    void myFunction() {
    
        try {
            somecode..
        } catch (IOException e){
            e.printStackTrace();
            doToast("Unknown Error");  //Display Toast to user
            return;           //Leave myFunction
        }
    
        somecode...  //If no error continue here
    
        return;
    }
    
    protected void doToast(final String str) {
        this.runOnUiThread(new Runnable() {
            public void run() {
                Toast.makeText(myClass.this, str, Toast.LENGTH_SHORT).show();
            }
        });
    
    }
    

    【讨论】:

    • 使用吐司当然是有效的,但我想知道我是否会遇到同样的问题。问题是 UI 在它吐出之前没有显示我的对话框。事实证明,被覆盖的 onResume() 是在对话框显示之前执行的,并且在那里失败了,因为代码需要一个数据库。如果没有先前的错误,我必须输入一个布尔值并仅测试/执行该依赖代码。一旦 onResume() 完成,对话框就会显示。一旦我保护了 onResume() 代码,我很确定 Toast 会起作用。谢谢。
    【解决方案3】:

    createDataBase() 是抛出错误还是自行处理?如果它自己处理异常,那么它永远不会到达您的外部块,因此您永远不会通过 catch 块。确保在方法签名的末尾添加throws IOException,如下所示:

    public void createDataBase() throws IOException {[...]}
    

    另外,请确保没有任何 try/catch 块在 createDataBase()内部 捕获 IOException。

    这样,每当IOException 出现时,它就会被委派给您的外部catch 块,您的对话框就会出现。

    【讨论】:

    • 哦该死的为什么这是新问题...我现在才注意到这篇文章已经快 7 年了......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2012-07-15
    相关资源
    最近更新 更多