我在Stackoverflow
回复了this问题,答案对我有用,它覆盖了handleUncaughtException
,我保存了异常并抛出了默认Unfortunately app has stopped working
,但是当我在我的应用程序中集成它时,我遇到了一个问题。
这是我得到的答案。
private Thread.UncaughtExceptionHandler defaultExceptionHandler;
public void registerCrash(){
defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler(){
@Override
public void uncaughtException (Thread thread, Throwable e){
handleUncaughtException (thread, e);
if(defaultExceptionHandler != null){
defaultExceptionHandler.uncaughtException(thread, e);
}
}
});
}
它的作用,首先转到handleUncaughtException (thread, e);
我将崩溃日志保存在此方法中,然后它读取此行
if(defaultExceptionHandler != null){
defaultExceptionHandler.uncaughtException(thread, e);
}
这里我们再次抛出未捕获的异常,因此它再次转到第一行,并再次保存异常,这将循环,应用程序变得无响应。
我想要的是保存崩溃日志,然后向用户显示默认的Unfortunate
消息。
修改
在应用程序启动时,它会读取此内容;
defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
当应用程序崩溃时,它会读取这些行
Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler(){
@Override
public void uncaughtException (Thread thread, Throwable e){
handleUncaughtException (thread, e); //Custom Method
if(defaultExceptionHandler != null){
defaultExceptionHandler.uncaughtException(thread, e);
}
}
所以首先进入handleUncaughtException()
我已经提供了自定义实现,然后就是这样;
if(defaultExceptionHandler != null){
defaultExceptionHandler.uncaughtException(thread, e);
}
defaultExceptionHandler
永远不会为空;所以它会在多次崩溃的情况下进入循环。
我尝试在那里添加count
,但每次都是0
。
答案 0 :(得分:1)
最可能的解释是,您的registerCrash()
方法被调用了两次。
第一次注册Handler 1
;此时没有默认处理程序,因此它将defaultExceptionHandler
设置为null
。第二次,您注册Handler 2
,然后更新defaultExceptionHandler
以指向Handler 1
。
在未捕获的异常中,首先调用Handler 2
。它调用您的自定义处理程序方法,然后调用defaultExceptionHandler
,现在指向Handler 1
。
Handler 1
。它第二次调用您的自定义处理程序方法,然后调用defaultExceptionHandler
,现在指向自己。重复此步骤,直到堆栈溢出。
我建议两个改变。首先,添加一个警卫以确保您只注册一次崩溃处理程序。其次,不要将回退处理程序存储在字段中;在闭包中捕获它,这样处理程序看到的值永远不会改变。
private static final AtomicBoolean CRASH_HANDLER_REGISTERED = new AtomicBoolean();
public void registerCrash() {
if (CRASH_HANDLER_REGISTERED.compareAndSet(false, true)) {
final Thread.UncaughtExceptionHandler defaultHandler =
Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(
new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable e) {
handleUncaughtException(thread, e); // Custom Method
if (defaultHandler != null) {
defaultHandler.uncaughtException(thread, e);
}
}
}
);
}
}
答案 1 :(得分:0)
我建议你尝试另一种方法,避免覆盖异常,捕获它并检索错误代码,并执行此操作:
when x code with x conditions verify, do that