异常:Handler sending message to a Handler on a dead thread
当我们在使用Thread和 Handler 进行线程操作的时候会发生 异常,错误信息包含 IllegalStateException: Handler (android.os.Handler) sending message to a Handler on a dead thread一般出现这种错误意味着在 Handler 进行 postMessage / post 操作的时候,Lopper 中的 MessageQueue 队列对象空了。这个异常我们可以在MessageQueue的enqueueMessage方法中看到,当消息队列为空的时候,mQuitting就是true了,再次发送的话就会报异常。
我在项目中遇到是因为在某一调用quit()方法之后,再次发送message,导致的,这里有的人说在发送之前重新初始化话Handler,但是即使quit之后重新初始化也无法再次使用HandlerThread,这里我才用的方法是通过使用反射方法,重新初始化 Looper 的 mQueue的值,如下代码
public void sendCancelConvertMsg(){
/**
* 这里通过反射解决异常:Handler sending message to a Handler on a dead thread
*/
Field messageQueueField = null;
try {
messageQueueField = Looper.class.getDeclaredField("mQueue");
messageQueueField.setAccessible(true);
Class<MessageQueue> messageQueueClass = (Class<MessageQueue>) Class.forName("android.os.MessageQueue");
Constructor<MessageQueue>[] messageQueueConstructor = (Constructor<MessageQueue>[]) messageQueueClass.getDeclaredConstructors();
for(Constructor<MessageQueue> constructor : messageQueueConstructor){
constructor.setAccessible(true);
Class[] types = constructor.getParameterTypes();
for(Class clazz : types){
if(clazz.getName().equalsIgnoreCase("boolean")){
messageQueueField.set(mConvertHandler.getLooper(), constructor.newInstance(true));
break;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
mConvertHandler.sendEmptyMessage(MESSAGE_CONVERT_CANCEL);
}