Java 服务默认异常处理程序不工作(threadID已更改)
我希望用户能够在我的服务崩溃时发送错误报告。我有一个GUI应用程序,可以通过服务中的广播进行更新。该服务在不同的进程中运行,并作为前台运行。我使用相同的代码将默认异常处理程序附加到我的GUI,在那里它工作正常(打开电子邮件发送应用程序,电子邮件正文包含异常)。但是对于我的服务线程,我无法让它们调用UncaughtExceptionHandler 到目前为止,我所做的研究是崩溃的线程与我在(229)上注册cutom exceptionhandler的线程具有不同的threadid(12)。注册和崩溃在同一个计时器中,并且应该具有相同的threadid Logcat输出:Java 服务默认异常处理程序不工作(threadID已更改),java,android,multithreading,service,exception-handling,Java,Android,Multithreading,Service,Exception Handling,我希望用户能够在我的服务崩溃时发送错误报告。我有一个GUI应用程序,可以通过服务中的广播进行更新。该服务在不同的进程中运行,并作为前台运行。我使用相同的代码将默认异常处理程序附加到我的GUI,在那里它工作正常(打开电子邮件发送应用程序,电子邮件正文包含异常)。但是对于我的服务线程,我无法让它们调用UncaughtExceptionHandler 到目前为止,我所做的研究是崩溃的线程与我在(229)上注册cutom exceptionhandler的线程具有不同的threadid(12)。注册和崩
> 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
}
}
forThread.setDefaultUncaughtExceptionHandler()
表示:
如果任何线程由于
未处理的异常
您不需要为每个线程调用该方法。尝试在服务的onCreate()
方法中设置默认句柄。for线程。setDefaultUncaughtExceptionHandler()
指示:
如果任何线程由于
未处理的异常
您不需要为每个线程调用该方法。尝试在服务的
onCreate()
方法中设置默认句柄。是的,这是我第一次尝试的结果。那也不行。我认为它不起作用,因为onCreate可能是一个OS线程(我在文档中找不到哪个线程调用onCreate方法)。我会做更多的研究。我认为“任何”是指过程中的每一个线程。是的,我认为您对文档的解释是正确的。但这对我的问题没有帮助。奇怪的是,我不再在logcat中获得堆栈转储代码>在mUEHandler
中。这不是递归的吗?您是否打算将异常传播到以前的默认处理程序?FWIW——对于我的一个应用程序,我在一个应用程序子类中实现了一个默认处理程序,类似于下面所描述的。我刚刚测试并确认,这种方法可以捕获服务中工作线程中的异常,无论是应用程序是单个进程还是服务处于单独进程中。是的,这就是我第一次尝试的结果。那也不行。我认为它不起作用,因为onCreate可能是一个OS线程(我在文档中找不到哪个线程调用onCreate方法)。我会做更多的研究。我认为“任何”是指过程中的每一个线程。是的,我认为您对文档的解释是正确的。但这对我的问题没有帮助。奇怪的是,我不再在logcat中获得堆栈转储代码>在mUEHandler
中。这不是递归的吗?您是否打算将异常传播到以前的默认处理程序?FWIW——对于我的一个应用程序,我在一个应用程序子类中实现了一个默认处理程序,类似于下面所描述的。我刚刚测试并确认,这种方法可以捕获服务中工作线程中的异常,无论是应用程序是单个进程还是服务处于单独进程中。只需调用Thread.setDefaultUncaughtExceptionHandler()
内部应用程序#onCreate
,(您需要扩展应用程序
类)只需在应用程序#onCreate
中调用线程.setDefaultUncaughtExceptionHandler()
(您需要扩展应用程序
类)