异常: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数据结构. 创建一个线程的时候,并不会自 ...
最新文章
- 机器狗背上枪成了无人杀手,6.5mm口径1200米射程,制造商已与美澳军队广泛合作...
- jQuery 事件绑定
- 无法载入增效工具_作业大队工具车间利用修旧赚“钱”
- 关于serialVersionUID的说明
- SAP 电商云 Spartacus UI 同 SAP Customer Data Cloud 的集成
- 《四世同堂》金句摘抄(四)
- [css] 写一个动画,向上匀速移动100px,向下以1.5倍速度移动200px,一直反复循环
- SpringBoot在项目中基本配置设置
- 利用Python读取外部数据文件
- PC-启动慢的解决好方法!
- 【求职】360 C++反向面经
- uni-app开发中的#ifdef MP是什么意思?条件编译
- 调侃腾讯和360的小段子
- 简单excel宏工具对数据进行脱敏
- 小麦苗的微信公众号开通啦,欢迎大家扫码关注
- 吉大19年9月计算机应用,吉大19年9月《计算机应用基础》作业考核试题(100分)
- HTTP状态码常见的状态码!
- echarts数据多项(多维度)数据展示,多个series
- 手机端input[type=date]的时候placeholder不起作用解决方案
- 简单的golang游戏服务器框架《railgun》的文档目录索引
热门文章
- 回溯算法高效解标准数独(MarkDown)
- ios visio流程图_Mac下有如Visio一样好用的流程图软件吗?
- Mysql分页查询出现重复数据
- linux查看日志内存,linux查看日志、磁盘、cpu、内存使用情况及清理磁盘,日志等。你需要的linux常用基本操作都在这里!!!...
- 微信推送封面尺寸_【新媒体干货】微信公众号封面图设计规范试行版
- wordpress基础插件开发3-add_action()案例研究
- Autojs.pro 7.0 - 免root 连点器
- matlab插值实验目的,matlab插值实验报告数学实验.doc
- mysql 1031_MySQL5.6数据导入MySQL5.7报错:ERROR 1031 (HY000)
- windows命令提示符运行.cpp文件