我们想要替换默认的未捕获异常,以便不显示默认的崩溃对话框。
问题是,如果您致电,Thread.setDefaultUncaughtExceptionHandler(YourHandler)
则在出现异常的情况下,应用程序“冻结”,并且会出现一个ANR(应用程序无响应)对话框。我们进行了实验,System.exit()
并Process.killProcess()
解决了问题,但从阅读此事看来,这似乎是令人沮丧的。
那么如何正确完成呢?
在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] 删除。
我来说两句