在处理未被捕获的异常后,如何阻止我的应用程序进行僵尸化?

时间:2012-04-05 18:00:58

标签: android exception-handling

我正在通过以下方式处理我的应用程序中发生的任何未捕获的异常:

Thread.setDefaultUncaughtExceptionHandler(this);

这是我的启动器Activity实现UncaughtExceptionListener。我处理异常并将其发送到我的日志服务器就好了,但是,我的应用程序然后没有结束。它只是作为一个僵尸一直运行,直到按下主页或后退按钮。如何在处理异常后终止进程?

修改
这是一个测试和工作活动,它抛出一个未被捕获的异常(由Thread捕获)并进行处理。从未发布toast,并且一旦记录异常,该过程将变为僵尸。

class TestActivity extends Activity implements UncaughtExceptionListener {

    @Override public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        Thread.setDefaultUncaughtExceptionHandler(this);
        throw new RuntimeException("I'm a destuctive booger.");

        setContentView(R.layout.activity_test);
    }

    @Override public void uncaughtException(Thread thread, Throwable toss) {
        Log.e(TAG, "An uncaught exception has been recieved.", toss);
        Toast.makeText(this, "Big Error", Toast.LENGTH_LONG).show();
    }
}

2 个答案:

答案 0 :(得分:1)

我使用您的示例代码进行了一些测试,发现finish()可以使用uncaughtException()。但它是静默的,所以不向用户提供任何反馈,并且像我一样,即使使用Toast,我也无法调用getApplicationContext()或任何其他可视消息框。

发送我能够发挥作用的任何反馈的唯一方法是使用NotificationManager使用NotificationgetApplicationContext()发送状态栏Context。< / p>

我没有花太多时间在它上面,但不幸的是,这似乎意味着必须提供一个PendingIntent来处理用户点击通知本身。如果为Activity设置的Activity是生成未处理异常的PendingIntent,那么使用相同Activity执行此操作显然会冒无限循环的风险。

然而,有可能创建一个变化的基本{{1}},可能会打开一个对话框主题并解释崩溃。

答案 1 :(得分:0)

不确定是否有更温和的方式来处理此问题,但您可以尝试:

import android.os.Process;

Process.killProcess(Process.myPid());