Android中设置全局未捕获的异常处理程序的理想方法是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (36)

我想为我的Android应用程序中的所有线程设置全局未捕获的异常处理程序。所以,在我的Application子类中,我Thread.UncaughtExceptionHandler为未捕获的异常设置了一个默认处理程序的实现:

Thread.setDefaultUncaughtExceptionHandler(
                new DefaultExceptionHandler(this));

什么是为未捕获的异常设置默认处理程序的正确和理想的方式?

提问于
用户回答回答于

首先要检查的是Android处理程序是否仍在调用。有可能你的版本被调用但失败致命,并且system_server在看到进程崩溃时显示一个通用对话框。

在处理程序顶部添加一些日志消息,以查看它是否到达那里。从getDefaultUncaughtExceptionHandler打印结果,然后抛出未捕获的异常以导致崩溃。密切关注logcat输出,看看发生了什么。

用户回答回答于

在Android中使用未捕获的异常处理程序时遇到的主要问题与主要(又名UI)线程中引发的异常有关。这是为什么。当应用程序启动系统调用ActivityThread.main方法准备并启动应用程序的主循环器时:

public static void main(String[] args) {
  …
  …
    Looper.prepareMainLooper();
  …
    Looper.loop();
    throw new RuntimeException("Main thread loop unexpectedly exited");
}

以下方法演示了这种技术:

private void startCatcher() {
    UncaughtExceptionHandler systemUncaughtHandler = Thread.getDefaultUncaughtExceptionHandler();

    // the following handler is used to catch exceptions thrown in background threads
    Thread.setDefaultUncaughtExceptionHandler(new UncaughtHandler(new Handler()));

    while (true) {
        try {
            Looper.loop();
            Thread.setDefaultUncaughtExceptionHandler(systemUncaughtHandler);
            throw new RuntimeException("Main thread loop unexpectedly exited");
        } catch (Throwable e) {
            showCrashDisplayActivity(e);
        }
    }
}

以下处理程序捕获这些异常并将它们传播到UI线程:

static class UncaughtHandler implements UncaughtExceptionHandler {

    private final Handler mHandler;

    UncaughtHandler(Handler handler) {
        mHandler = handler;
    }

    public void uncaughtException(Thread thread, final Throwable e) {
        mHandler.post(new Runnable() {
            public void run() {
                throw new BackgroundException(e);
            }
        });
    }
}

扫码关注云+社区