使用UncaughtExceptionHandler来完成Android通常所做的事情,以及我需要的额外功能

使用UncaughtExceptionHandler来完成Android通常所做的事情,以及我需要的额外功能,android,exception,uncaughtexceptionhandler,Android,Exception,Uncaughtexceptionhandler,我正在开发一个Android库,如果发现未捕获的异常,我需要执行一些操作 我正在成功设置我的未捕获异常处理程序并运行我需要的代码,这是将一些信息发布到web服务器,但在我的部分完成后,我希望应用程序执行Android通常执行的操作,即向用户显示一个对话框,通知他们它已崩溃,然后退出应用程序,并将详细信息发布到Google Play开发者控制台 目前,我的未捕获异常已成功发布到服务器,但随后应用程序仍在运行,但由于线程消失,处于一种有点奇怪的状态,通常情况下,如果抛出我的未捕获异常,Android

我正在开发一个Android库,如果发现未捕获的异常,我需要执行一些操作

我正在成功设置我的未捕获异常处理程序并运行我需要的代码,这是将一些信息发布到web服务器,但在我的部分完成后,我希望应用程序执行Android通常执行的操作,即向用户显示一个对话框,通知他们它已崩溃,然后退出应用程序,并将详细信息发布到Google Play开发者控制台

目前,我的未捕获异常已成功发布到服务器,但随后应用程序仍在运行,但由于线程消失,处于一种有点奇怪的状态,通常情况下,如果抛出我的未捕获异常,Android会关闭应用程序

以下是我如何执行未捕获异常处理程序:

private static void setUnhandledExceptionHandler()
    {
        Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler()
        {
            @Override
            public void uncaughtException(final Thread thread, final Throwable) {
                CrashReporter.ReportUnhandledCrash(((Exception) ex));
                Looper.loop();
            }
        });
    }

基本上,我想做的是,让我的应用程序通过我未处理的异常处理程序发布到我的服务器,然后退出应用程序,就像Android通常做的那样,即在使用时显示一个强制关闭错误并关闭应用程序

我能看到你如何做到这一点的唯一方法既不干净也不愉快,所以在我们开始之前,我要说声对不起

操作顺序为:

  • 存储未捕获的异常
  • 如前所述记录异常
  • 通过使用null调用set方法取消注册未捕获的异常处理程序
  • 启动一个新线程,抛出存储的异常

  • 您实际上是在两次抛出相同的异常,但在第二次抛出时删除了恢复机制。

    我在跟踪GoogleAnalytics时遇到了类似的问题-大多数异常在我尝试在默认处理程序中报告时丢失。所以我缓存了它们,并在下一次启动时报告它们

    让应用程序崩溃的第二个技巧(希望这能回答您的问题)是存储“旧”DefaultUncaughtExceptionHandler并将异常传递给它

    下面的onCreate方法是我的应用程序类之一

    @Override
    public void onCreate()
    {
         super.onCreate();
         trackCachedException();
         setupExceptionHandling();
    }
    
    
    private void setupExceptionHandling()
    {
        _systemExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
        Thread.UncaughtExceptionHandler myHandler = new Thread.UncaughtExceptionHandler()
        {
    
            @Override
            public void uncaughtException(Thread thread, Throwable ex)
            {
                cacheException(thread.getName(), ex);
                if (_systemExceptionHandler != null)
                {
                    _systemExceptionHandler.uncaughtException(thread, ex);
                }
            }
        };
        // Make myHandler the new default uncaught exception handler.
        Thread.setDefaultUncaughtExceptionHandler(myHandler);
    }
    

    你的问题是什么?对不起,不是很清楚,我已经更新了我的问题