异常:Handler sending message to a Handler on a dead thread
异常: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);}
异常:Handler sending message to a Handler on a dead thread相关推荐
- 【Android 异步操作】手写 Handler ( 总结 | Message | MessageQueue | Looper | Handler ) ★
文章目录 一.Message 消息 二.Handler 消息处理者 三.MessageQueue 消息队列 四.Looper 循环者 五.关于 Looper 线程本地变量的说明 一.Message 消 ...
- java.lang.RuntimeException: Handler (com.***.behavior.BEvent$1) {421bca80} sending message to a Hand
java.lang.RuntimeException: Handler (com.***.behavior.BEvent$1) {421bca80} sending message to a Hand ...
- android message 代码,Android Handler移除Message详解及实例代码
Android Handler移除Message详解 问题: 1.removeMessage(what)函数是否只能移除对应what值的Message? 2.对于Delayed发送的Message,能 ...
- Android基础架构:Native层 Looper、Handler、Message 研究
Android基础架构:Native层 Looper.Handler.Message 研究1,参考: https://www.cnblogs.com/roger-yu/p/15099541.html ...
- 【Android 异步操作】Handler 机制 ( Android 提供的 Handler 源码解析 | Handler 构造与消息分发 | MessageQueue 消息队列相关方法 )
文章目录 一.Handler 构造函数 二.Handler 消息分发 三.MessageQueue 消息队列相关函数 一.Handler 构造函数 一般使用 Handler 时 , 调用 Handle ...
- 再探Handler(上)(Handler核心原理最全解析)
很久之前也写过Handler的相关文章,现在回过头去看,理解的还是较为浅薄.于是乎,决定再来深入研究一遍Handler. 首先抛出一个问题:子线程到主线程的通信方式有哪些?子线程到主线程通信的原理是什 ...
- handler 与message的一些理解
观点一: Android 对进程的重要性评级的时候,选取它最高的级别.另外,当被另外的一个进程依赖的时候,某个进程的级别可能会增高.一个为其他进程服务的进程永远不会比被服务的进程重要级低.因为服务进程 ...
- 深入理解Handler、Message、MessageQueue、Looper
本文是从源码的角度对andorid异步消息处理机制的梳理,那么在文章开始阶段,先简单介绍,异步消息处理机制中各部件的作用以及处理处理机制的概述 1.Handler.Message.MessageQue ...
- Message、Handler、Message Queue、Looper之间的关系
2019独角兽企业重金招聘Python工程师标准>>> 在单线程模型下,为了解决线程通信问题,Android设计了一个通信机制.Message Queue(消息队列), 线程间的通信 ...
- Android 中Message,MessageQueue,Looper,Handler详解+实例
一.几个关键概念 1.MessageQueue:是一种数据结构,见名知义,就是一个消息队列,存放消息的地方.每一个线程最多只可以拥有一个MessageQueue数据结构. 创建一个线程的时候,并不会自 ...
最新文章
- 【2021-12-06】爬取关键词图片 - 去掉重复图片
- 网站被黑搜索快照被劫持怎么办
- JavaScript 笔记(2) -- 类型转换 正则表达 变量提升 表单验证
- 201807 相关性度量的几种方法-卡方检验、相关系数、信息增益...
- 游戏服务器的架构演进
- Windows10系统Python2.7通过Swig调用C++过程
- Virut样本取证特征
- 2、Shiro的认证
- duplicate复制数据库
- 字符编码——简体中文编码中区位码、国标码、内码、外码、字形码的区别及关系
- 使用QPainter绘制饼状图,并显示所占百分比
- 【python】用ChatGPT使用爬虫
- esp寄存器与ebp寄存器介绍
- ORACLE中的日期相减
- 动态站点:部署论坛系统Discuz!
- 今天推荐一下网友张迪的博客
- MyZip Pro for Mac一款专业解压缩软件,解压缩速度超级快。
- 怎么通过外网来访问自己在Tomcat服务器中配置的项目
- 景区怎么防止年票卡多人使用?
- 爬虫项目实操二、爬取“下厨房”网站的菜名、所需材料、和菜名所对应的详情页URL