Java 服务默认异常处理程序不工作(threadID已更改)

Java 服务默认异常处理程序不工作(threadID已更改),java,android,multithreading,service,exception-handling,Java,Android,Multithreading,Service,Exception Handling,我希望用户能够在我的服务崩溃时发送错误报告。我有一个GUI应用程序,可以通过服务中的广播进行更新。该服务在不同的进程中运行,并作为前台运行。我使用相同的代码将默认异常处理程序附加到我的GUI,在那里它工作正常(打开电子邮件发送应用程序,电子邮件正文包含异常)。但是对于我的服务线程,我无法让它们调用UncaughtExceptionHandler 到目前为止,我所做的研究是崩溃的线程与我在(229)上注册cutom exceptionhandler的线程具有不同的threadid(12)。注册和崩

我希望用户能够在我的服务崩溃时发送错误报告。我有一个GUI应用程序,可以通过服务中的广播进行更新。该服务在不同的进程中运行,并作为前台运行。我使用相同的代码将默认异常处理程序附加到我的GUI,在那里它工作正常(打开电子邮件发送应用程序,电子邮件正文包含异常)。但是对于我的服务线程,我无法让它们调用UncaughtExceptionHandler

到目前为止,我所做的研究是崩溃的线程与我在(229)上注册cutom exceptionhandler的线程具有不同的threadid(12)。注册和崩溃在同一个计时器中,并且应该具有相同的threadid

Logcat输出:

> D/Registratie: General exception handler set for threadid=229 
> D/Registratie: ThreadName in Timer_Tick: Timer-0 threadId=229
> D/Registratie: ThreadName in Timer_Tick: Timer-0 threadId=229
> D/Registratie: ThreadName in Timer_Tick: Timer-0 threadId=229
> D/Registratie: Throw ArrayIndexOutOfBounds exception W/dalvikvm:
> threadid=12: thread exiting with uncaught exception (group=0x4169fba8)
服务成员和方法:

// declared non-anonymous to prevent the garbage collector erroneously clearing
private Thread.UncaughtExceptionHandler mUEHandler; 


public void attachGeneralExceptionHandler(){

        mUEHandler = new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                Log.d(TAG, "Custom crash handler: build crashrapport and intent");
                sendExceptionReport(t,e);

                mUEHandler.uncaughtException(t, e);

            }
        };

        Thread.setDefaultUncaughtExceptionHandler(mUEHandler);
        Log.d(TAG, "General exception handler set for ThreadName: " + Thread.currentThread().getName() + " threadid=" + Thread.currentThread().getId());

    }
来自服务的TimerTick:

private Runnable Timer_Tick = new Runnable() {
        public void run() {

            if(!uncaughtExceptionHandlerSet) {
                // Make sure the exception handler is connected to this Timer_Tick thread
                attachGeneralExceptionHandler();
                uncaughtExceptionHandlerSet=true;
            }
            Log.d(TAG, "ThreadName in Timer_Tick: "+ Thread.currentThread().getName()+" threadId="+Thread.currentThread().getId());

            if(testExceptionHandling){
                Log.d("TAG", "Throw ArrayIndexOutOfBounds exception");
                int[] exceptionTest = new int[3];
                exceptionTest[3] = -1; // throws exception on thread with threadid 12, only one line in logcat

            }
}
for
Thread.setDefaultUncaughtExceptionHandler()
表示:

如果任何线程由于 未处理的异常

您不需要为每个线程调用该方法。尝试在服务的
onCreate()
方法中设置默认句柄。

for
线程。setDefaultUncaughtExceptionHandler()
指示:

如果任何线程由于 未处理的异常


您不需要为每个线程调用该方法。尝试在服务的
onCreate()
方法中设置默认句柄。

是的,这是我第一次尝试的结果。那也不行。我认为它不起作用,因为onCreate可能是一个OS线程(我在文档中找不到哪个线程调用onCreate方法)。我会做更多的研究。我认为“任何”是指过程中的每一个线程。是的,我认为您对文档的解释是正确的。但这对我的问题没有帮助。奇怪的是,我不再在logcat中获得堆栈转储
mUEHandler
中。这不是递归的吗?您是否打算将异常传播到以前的默认处理程序?FWIW——对于我的一个应用程序,我在一个应用程序子类中实现了一个默认处理程序,类似于下面所描述的。我刚刚测试并确认,这种方法可以捕获服务中工作线程中的异常,无论是应用程序是单个进程还是服务处于单独进程中。是的,这就是我第一次尝试的结果。那也不行。我认为它不起作用,因为onCreate可能是一个OS线程(我在文档中找不到哪个线程调用onCreate方法)。我会做更多的研究。我认为“任何”是指过程中的每一个线程。是的,我认为您对文档的解释是正确的。但这对我的问题没有帮助。奇怪的是,我不再在logcat中获得堆栈转储
mUEHandler
中。这不是递归的吗?您是否打算将异常传播到以前的默认处理程序?FWIW——对于我的一个应用程序,我在一个应用程序子类中实现了一个默认处理程序,类似于下面所描述的。我刚刚测试并确认,这种方法可以捕获服务中工作线程中的异常,无论是应用程序是单个进程还是服务处于单独进程中。只需调用
Thread.setDefaultUncaughtExceptionHandler()
内部
应用程序#onCreate
,(您需要扩展
应用程序
类)只需在
应用程序#onCreate
中调用
线程.setDefaultUncaughtExceptionHandler()
(您需要扩展
应用程序
类)