替换默认的未捕获异常处理程序以避免崩溃对话框

亚历克斯

我们想要替换默认的未捕获异常,以便不显示默认的崩溃对话框。

问题是,如果您致电,Thread.setDefaultUncaughtExceptionHandler(YourHandler)则在出现异常的情况下,应用程序“冻结”,并且会出现一个ANR(应用程序无响应)对话框。我们进行了实验,System.exit()Process.killProcess()解决了问题,但从阅读此事看来,这似乎是令人沮丧的。

那么如何正确完成呢?

亚历克斯

TL; DR

com.android.internal.os.RuntimeInit.UncaughtHandler的默认未捕获异常处理程序的框架实现中采用代码,省略显示对话框的部分。

下钻

首先,它很清楚,System.exit()而且Process.killProcess()是在方案必须在应用程序崩溃(至少这是在谷歌的人是怎么想的)。
重要的是要注意,com.android.internal.os.RuntimeInit.UncaughtHandler在框架版本之间可能(并且确实)会发生变化,并且其中的某些代码不可用于您自己的实现。
如果您不关心默认崩溃对话框,而只想向默认处理程序中添加一些内容,则应该包装默认处理程序。(例如,参见底部)

我们的默认未捕获异常处理程序(无对话框)

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable ex) {
    try {
        // Don't re-enter -- avoid infinite loops if crash-reporting crashes.
        if (mCrashing) {
            return;
        }
        mCrashing = true;

        String message = "FATAL EXCEPTION: " + t.getName() + "\n" + "PID: " + Process.myPid();
        Log.e(TAG, message, ex);
    } catch (Throwable t2) {
        if (t2 instanceof DeadObjectException) {
            // System process is dead; ignore
        }
        else {
            try {
                Log.e(TAG, "Error reporting crash", t2);
            } catch (Throwable t3) {
                // Even Log.e() fails!  Oh well.
            }
        }
    } finally {
        // Try everything to make sure this process goes away.
        Process.killProcess(Process.myPid());
        System.exit(10);
    }
}

})

包装默认处理程序

final Thread.UncaughtExceptionHandler defHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    @Override
    public void uncaughtException(Thread t, Throwable ex) {
        try {
            //your own addition 
        } 
        finally {
            defHandler.uncaughtException(t, ex);
        }
    }
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

PrimeFaces异常处理程序和对话框覆盖

WPF对话框不起作用的应用程序未处理异常

如何捕获从FormFlow对话框引发的异常?

HttpsURLConnection显示“安全警告”对话框,而不是捕获异常

未捕获的异常处理程序中的未捕获的异常

如何替换Android的默认共享对话框?

警报对话框使应用程序崩溃

尝试弹出对话框时应用程序崩溃

子对话框-SetWindowTextA或SendMessageA使程序崩溃-MFC

由于对话框,我的应用程序崩溃

保存文件对话框未处理的异常

AlertBuilder显示异常。对话框未打开

Java未捕获的全局异常处理程序

Haxe未捕获的全局异常处理程序

Swift:是否可以避免登录时出现Facebook SDK 4.x“您已授权此应用程序”对话框?

引导程序模式对话框中的默认按钮

替换NAN值以避免崩溃

如何使用QDialogButtonBox处理程序中止退出对话框?

Visual Studio打破了由未处理的异常对话框处理的异常

模态对话框处理

在关闭对话框后再次打开对话框时,应用程序崩溃并给出“ java.lang.IllegalStateException”

setOnClickListener 时对话框崩溃

对话框导致应用崩溃

不支持字体时,如何制作异常处理程序以避免挂起系统?

捕获输入结果-显示对话框

Java:神秘的Java未捕获的异常处理程序(带代码)

异常处理程序中间件未捕获

Lumen:异常处理程序 - 未捕获 QueryException 或 PDOException

带有阵列适配器的警报对话框未捕获点击