我们想要替换默认的未捕获异常,以便不显示默认的崩溃对话框.
问题是,如果你调用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() {@OverrIDepublic 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); } }});
总结 以上是内存溢出为你收集整理的android – 替换默认的未捕获异常处理程序以避免崩溃对话框全部内容,希望文章能够帮你解决android – 替换默认的未捕获异常处理程序以避免崩溃对话框所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)