Java Android:线程中出现未捕获异常时强制崩溃

Java Android:线程中出现未捕获异常时强制崩溃,java,android,exception,Java,Android,Exception,我正在开发一个应用程序,每隔一段时间,我的一个后台工作线程就会有一个未捕获的异常。这些异常会使该线程崩溃,但由于它不在UI线程上,因此应用程序会继续运行如何在后台线程中强制这些未捕获的异常使整个应用程序崩溃?如果有相同的上下文崩溃信息(如堆栈跟踪)就好了 我想这样做,当我向测试人员发布应用程序时,它不会变得无响应。相反,当后台线程出现未捕获的异常时,应用程序将转到其崩溃处理程序并向我发送报告(我正在使用ACRA,但这不重要)。这比静默失败的应用程序要好。您可以在实现java.lang.Threa

我正在开发一个应用程序,每隔一段时间,我的一个后台工作线程就会有一个未捕获的异常。这些异常会使该线程崩溃,但由于它不在UI线程上,因此应用程序会继续运行如何在后台线程中强制这些未捕获的异常使整个应用程序崩溃?如果有相同的上下文崩溃信息(如堆栈跟踪)就好了


我想这样做,当我向测试人员发布应用程序时,它不会变得无响应。相反,当后台线程出现未捕获的异常时,应用程序将转到其崩溃处理程序并向我发送报告(我正在使用ACRA,但这不重要)。这比静默失败的应用程序要好。

您可以在实现
java.lang.Thread.UncaughtExceptionHandler
的类中捕获未捕获的异常

  • 创建一个实现UncaughtExceptionHandler的类,并将所需的行为放入
    uncaughtException
    overidden函数中
    您可以在这个函数中执行任何您想要的行为,如向服务器发送日志、向用户显示自定义崩溃对话框等
  • 在活动/线程中添加
    thread.setDefaultUncaughtExceptionHandler()
    ;并给出异常处理程序类的一个实例


回答晚了,但我问了自己同样的问题

我们在生产中使用Crashlytics,但如果应用程序是为开发而构建的,则会启用一些断言,记录错误实际上会抛出它,这样开发人员就可以检测到任何不正确的行为

但正如您所说,在后台线程中抛出错误不会使应用程序崩溃

为了确保应用程序在buildfordevelopment时立即崩溃,我们只需在主循环器上使用一个处理程序在主线程上抛出异常

看起来有点像这样:


public static void assertTrue(boolean condition, String msg) {
    if (condition) {
        return;
    }

    final IllegalStateException e = new IllegalStateException(message);
    if (BuildConfig.RELEASE) {
        Crashlytics.logException(e);
        return;
    }

    Log.e("ASSERT", message, e);
    if (Looper.getMainLooper() != Looper.myLooper()) {
        mMainThreadHandler.post(new Runnable() {
            @Override
            public void run() {
                throw e;
            }
        });
    }

    throw e;
}

以下原始版本

实际上,在进一步测试之后,我发现您可以通过直接将异常处理到主线程来简化代码

public static <T extends Exception> void throwOnMainThread(T exception) {
    Thread mainThread = Looper.getMainLooper().getThread();
    mainThread.getUncaughtExceptionHandler().uncaughtException(mainThread, exception);
}

例如。

这并不适用于所有Executor实现。他们中的一些人不呼叫处理程序。您必须在执行后重写
,并从那里重新抛出运行时异常或错误,以迫使其崩溃。虽然这看起来是一个很有希望的解决方案,但有几件事我还不清楚:1。如何避免run()2中“未捕获异常”的Intellij错误。在这个静态上下文中,你从哪里获得mainThreadHandler?新的答案不会导致应用程序崩溃,但post方法确实有效
public static <T extends Exception> void throwOnMainThread(final T exception) {
    Handler mainThreadHandler = new Handler(Looper.getMainLooper());
    mainThreadHandler.post(new Runnable() {
        @Override
        public void run() {
            Thread currentThread = Thread.currentThread();
            currentThread.getUncaughtExceptionHandler().uncaughtException(currentThread, exception);
        }
    });
}
ThreadUtils.throwOnMainThread(new RuntimeException());