我花了一整天的时间试图找出线程停止的原因后发现了这一点。事业证明是一个简单的IndexOutOfBondException
。如果在logcat中显示异常,我会在一分钟内解决这个问题。任何人都可以告诉我为什么在自定义线程中抛出异常会导致线程停止,如何捕获并记录它?
我使用ExecutorService
来创建和处理我的自定义线程。
private ExecutorService processingThread = Executors.newSingleThreadExecutor(r -> new Thread(r, "processingThread"));
我使用android studio。
第二个屏幕截图中的代码位于onDrawFrame()
中的GLRenderer
函数内。
第一个屏幕截图中的代码位于提交函数中的lambda thingy内,该函数位于onDrawFrame()
中的GLRenderer
函数中(原谅我的英文)。
非常感谢
答案 0 :(得分:1)
您无法直接在主线程中捕获Thread中的异常。
线程即将因未捕获的异常而终止
- Java虚拟机将使用Thread.getUncaughtExceptionHandler()在线程中查询其UncaughtExceptionHandler 并将调用处理程序的uncaughtException方法,传递 线程和异常作为参数。
- 如果某个线程没有明确设置其UncaughtExceptionHandler, 然后它的ThreadGroup对象充当其UncaughtExceptionHandler。
- 如果ThreadGroup对象没有特殊的处理要求 例外,它可以将调用转发到默认的未捕获 异常处理程序。
醇>
您可以从线程中捕获运行时异常,如下所示:
Thread.UncaughtExceptionHandler h = new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread th, Throwable ex) {
Log.e("TEST","Uncaught exception: " + ex);
}
};
final Thread thread = new Thread() {
public void run() {
Log.d("TEST","Performing action...");
throw new RuntimeException("Exception from thread");
}
};
thread.setUncaughtExceptionHandler(h);
thread.start();