gpt4 book ai didi

android - 如何在不更改其功能的情况下覆盖处理未捕获的异常

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:36:13 25 4
gpt4 key购买 nike

我问了this一段时间后在 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);
}
}
});
}

它做什么,首先它转到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 永远不会为 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);
}
}
}
);
}
}

关于android - 如何在不更改其功能的情况下覆盖处理未捕获的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45402231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com