dev*_*v90 6 performance android exception-handling android-fragments
我回过头来问过这个问题Stackoverflow,答案对我有用,它会覆盖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);
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
它做了什么,首先是handleUncaughtException (thread, e);我在这个方法中保存崩溃日志,然后它读取这一行
if(defaultExceptionHandler != null){
defaultExceptionHandler.uncaughtException(thread, e);
}
Run Code Online (Sandbox Code Playgroud)
在这里我们再次抛出未捕获的异常,因此它再次转到第一行,并再次保存异常,这将进入循环,应用程序变得无响应.
我想要的是保存崩溃日志,然后Unfortunate向用户显示默认消息.
编辑
在应用程序启动时,它读取此
defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
Run Code Online (Sandbox Code Playgroud)
当应用程序崩溃时,它会读取这些行
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);
}
}
Run Code Online (Sandbox Code Playgroud)
所以它首先去handleUncaughtException()那里我提供了自定义实现,然后它去了;
if(defaultExceptionHandler != null){
defaultExceptionHandler.uncaughtException(thread, e);
}
Run Code Online (Sandbox Code Playgroud)
将defaultExceptionHandler永远不能为null; 所以它会在多次崩溃的情况下进入循环.
我试过count在那里添加,但0每次都是这样.
最可能的解释是您的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);
}
}
}
);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
291 次 |
| 最近记录: |