缩略信息是: sending message to a Handler on a dead thread 我是用IntentService时报的

2024年全国大学生电子设计竞赛A题_AC-AC变换电路并联运行 AC-AC变换电路并联运行(A 题)【本科组】 阅读详情

稍微纤细一点儿的信息是: Handler (android.os.Handler) {215ddea8} sending message to a Handler on a dead thread。

在另一次在IntentService里使用MediaPlayer 播放铃声也再现错误,信息是:Handler) {42414500} sending message to a Handler on a dead thread。

本次的完整信息是:

W/ActivityManager( 1394): getTasks: caller 10034 is using old GET_TASKS but privileged; allowing


W/MessageQueue( 7666): Handler (android.os.Handler) {215ddea8} sending message to a Handler on a dead thread


W/MessageQueue( 7666): java.lang.IllegalStateException: Handler (android.os.Handler) {215ddea8} sending message to a Handler on a dead thread


W/MessageQueue( 7666):  at android.os.MessageQueue.enqueueMessage(MessageQueue.java:325)


W/MessageQueue( 7666):  at android.os.Handler.enqueueMessage(Handler.java:635)


W/MessageQueue( 7666):  at android.os.Handler.sendMessageAtTime(Handler.java:604)


W/MessageQueue( 7666):  at android.os.Handler.sendMessageDelayed(Handler.java:574)


W/MessageQueue( 7666):  at android.os.Handler.postDelayed(Handler.java:398)


W/MessageQueue( 7666):  at com.bandwidthx.library.l.a(SourceFile:367)


W/MessageQueue( 7666):  at com.bandwidthx.library.l.B(SourceFile:357)


W/MessageQueue( 7666):  at com.bandwidthx.library.BxApproval.aZ(SourceFile:4563)


W/MessageQueue( 7666):  at com.bandwidthx.library.BxApproval.aT(SourceFile:4440)


W/MessageQueue( 7666):  at com.bandwidthx.library.BxApproval.aS(SourceFile:4431)


W/MessageQueue( 7666):  at com.bandwidthx.library.BxApproval.aG(SourceFile:4044)


W/MessageQueue( 7666):  at com.bandwidthx.library.l.a(SourceFile:1320)


W/MessageQueue( 7666):  at com.bandwidthx.library.l.j(SourceFile:1275)


W/MessageQueue( 7666):  at com.bandwidthx.library.q.w(SourceFile:2280)


W/MessageQueue( 7666):  at com.bandwidthx.library.q.a(SourceFile:3399)


W/MessageQueue( 7666):  at com.bandwidthx.library.q.a(SourceFile:3103)


W/MessageQueue( 7666):  at com.bandwidthx.library.q$1.a(SourceFile:1959)


W/MessageQueue( 7666):  at com.bandwidthx.library.q$1.doInBackground(SourceFile:1928)


W/MessageQueue( 7666):  at android.os.AsyncTask$2.call(AsyncTask.java:292)
W/MessageQueue( 7666):  at java.util.concurrent.FutureTask.run(FutureTask.java:237)


W/MessageQueue( 7666):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)


W/MessageQueue( 7666):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)


W/MessageQueue( 7666):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)


W/MessageQueue( 7666):  at java.lang.Thread.run(Thread.java:818)

估计Looper啊,MessageQueue之类的,已经被你们说烂了。

 

我就简单概括一句(当然下面也有很详细的)

一旦一个线程的消息循环退出后,不能再给其发送消息,否则会有RuntimeException抛出。
就是你一般性看到的:

"RuntimeException: Handler{xxxx} sending message to a Handler on a dead thread"。

一般性的,如果是你实现自己的Looper和Handler,建议在Looper.prepare()后,调用Looper.myLooper()来获取对这个线程Looper的引用。
用途:0. 可以调用quit()终止服务线程   1. 接收消息时检查消息循环是否已经退出

 

值得一说的是: 线程终止了,有时候并不是你自己终止的,很可能能是系统的某个正常的时序导致的(只是你没有注意到这个次序,然后写代码的时候没有注意)


 

上面已经说清楚了,下面是详细信息&啰嗦分界线(下面再多说也就这么回事儿,别往下看了,下面就说一个简单的案例)

 

案例:(使用 IntentService 的发送短信,代码如下)

在IntentService内部实际是开启的一个工作线程。

@Override
protected void onHandleIntent(Intent intent) {
    Bundle data = intent.getExtras();
    String[] recipients = null;
    String message = getString(R.string.unknown_event);
    String name = getString(R.string.app_name);
    if (data != null && data.containsKey(Constants.Services.RECIPIENTS)) {
        recipients = data.getStringArray(Constants.Services.RECIPIENTS);
        name = data.getString(Constants.Services.NAME);
        message = data.getString(Constants.Services.MESSAGE);
        for (int i = 0; i < recipients.length; i++) {
            if(!StringUtils.isNullOrEmpty(recipients[i])) {
                try {
                    Intent sendIntent = new Intent(this, SMSReceiver.class);
                    sendIntent.setAction(Constants.SMS.SEND_ACTION);
                    PendingIntent sendPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, sendIntent, PendingIntent.FLAG_UPDATE_CURRENT);
                    Intent deliveryIntent = new Intent(this, SMSReceiver.class);
                    deliveryIntent.setAction(Constants.SMS.DELIVERED_ACTION);
                    PendingIntent deliveryPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, deliveryIntent, PendingIntent.FLAG_UPDATE_CURRENT);
                    SmsManager.getDefault().sendTextMessage(recipients[i].trim(), null, "[" + name + "] " + message, sendPendingIntent, deliveryPendingIntent);
                } catch (Exception e) {
                    Log.e(TAG, "sendTextMessage", e);
                    e.printStackTrace();
                    Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
                    MainActivity.instance.writeToLogFile(e.getMessage(), System.currentTimeMillis());                       
                }
            }
        }
    }
}

(明眼人一看就知道,那个catch语句写的有问题)

catch (Exception e) {
     Log.e(TAG, "sendTextMessage", e);
     e.printStackTrace();
     Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
     MainActivity.instance.writeToLogFile(e.getMessage(), System.currentTimeMillis());                       
}

结果就报错了:

Google了一下资料,网址上是这么说的:

(大意翻译: 原因是你在一个由intentService控制生命周期的线程种创建了toast,手机先会显示这个toast,之后还是用这个线程的handler去隐藏&关闭这个toast;但是当onHandleIntent结束的时候,这个线程就挂了,然后绑定在这个线程上的handler也就不存在了,完事儿这个toast就关闭不了了,怎么办呢?发给主线程吧,它的toast的Handeler还存活,可以隐藏toast)

 

解决方案呢?(简单,粗暴)

 


 

哪些问题还有什么没有说?

为什么会向一个死线程发消息呢?

因为onHandleIntent(Intent intent)结束了这个线程也就没有了,到底怎么回事儿?

 

handler没有了,所以cannot hide toast?

如果我没有记错的话,这个toast的生命周期应该是NotificationManagerService控制的吧?

 

(IntentService源码剖析)----TODO

(Toast生命周期源码剖析)----TODO



基于STM32L4XX、HAL库的ESP32-S3-WROOM-1-N4 WIFI模块驱动程序设计 / 检查是否收到完整的一行(以\r\n结尾)// 例如: 解析AT命令响应或MQTT消息等。// UART2初始化已在CubeMX中配置。// USART2初始化函数(由CubeMX生成)// 缓冲区溢出,重置。// 如果需要等待响应。// 处理接收到的数据。// 处理接收到的数据。// 等待ESP32模块启动。// 主循环其他任务。// 启用UART全局中断。// 发送HTTP GET请求。// 发送AT测试命令。// 连接Wi-Fi。// UART中断回调函数。 阅读详情

相关推荐

python等级考试——一级知识点汇总(不包含turtle画图)

本篇文章是针对中国电子学会青少年编程等级考试的,适合初学者以及青少年编程学习者

weixin_65350557的博客 9037

异常: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...

lf0814的博客 2万+

PX4笔记系列(二)vtol_att_control中的tiltrotor解析

update_vtol_state() 注释:采用两段切换的简单逻辑来进行过渡 当切换过渡开关后,飞机将会开始倾转动力,逐渐加速,当飞机获得足够速度后动力将会完全打到向前的位置。对于过渡返回阶段动力则是简单地倾转回来。 如果(不在向前过渡指令下): 当前vtol飞行模式: 1、旋翼模式 无操作 2、固定翼模式 令vtol飞行模式切换到过渡返回模式 3、P1过渡模式 进入过渡失败安全返回至旋翼模式 4、P2过渡模式 进入过渡失败安全返回至旋翼模式 5、过渡返回模式 记录过渡返回时间=当前时间-过渡开始

hypersonicss的博客 1881

sending message to a Handler on a dead thread

EachHandlerhas aLooper, and aLooperis associated with aThread(usually aHandlerThread). The general problem is when aHandlerbecomes associated with thread that stops running. If someone tries to use theHandler, it will fail with the message "send...

changliangdoscript的专栏 4153

WebRTC Qos优化杂记

本文是笔者对WebRTC Qos性能研究、优化的一些思考,希望对有兴趣的读者有一些启发。

sonysuqin的专栏 6679

单细胞测序数据分析——细胞通讯 CellChat

cellchat

G2530051386的博客 1万+

使用Handler的时候究竟发生了什么

分析源码带你了解当你使用Handler的时候究竟发生了什么

进击的小怪兽 891

如何打开本地网络的防火墙端口(Windows版)解决ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。问题

ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。 最开始在遇到这个报错的时候十分不解,后来经过思考,有可能是服务器端口占用,或者并没有放行。因此搜查问题的关键是要先去排查问题。 在搜索栏输入控制面板 选择防火墙 选择开关 保证这些选项是开着的 选择高级设置 新建规则 创建协议端口 选择端口 允许连接 点击下一步 创建规则后点击下一步(后命名) 选择任意端口ALL即可 问题排查完毕!socket创建网络通信时,有读者

weixin_46900108的博客 9万+

java.lang.RuntimeException: Handler (android.os.Handler) sending message to a Handler on a dead thre

1 问题描述 app内部切换Activity或者Fragment都会出现 java.lang.RuntimeException: Handler (android.os.Handler) sending message to a Handler on a dead thread 2 问题分析 google找到类似问题,基本都是以下情况: http://stackoverflo

克里斯的一小步 8573

c++11 无锁队列

/************************************************************************* &gt; File Name: lockfreequeue.cpp &gt; Author: &gt; Mail: &gt; Created Time: Wed 08 Aug 2018 11:38:08 AM CST ********...

qq_35728402的博客 5024

UE5新手必看:如何在UMG控件中嵌入浏览器实现Web页面展示(附完整步骤)

本文为UE5新手提供了在UMG控件中无缝集成Web浏览器的完整实战指南。详细介绍了从启用WebBrowser插件、创建并配置WebBrowser控件蓝图,到编写动态加载与交互逻辑,以及在游戏关卡中实例化UI的全过程。文章还分享了性能优化技巧与常见问题排查方法,帮助开发者高效实现游戏UI内的Web页面展示与交互。

weixin_29243063的博客 713

W/MessageQueue: Handler (android.os.Handler) {4241f8f8} sending message to a Handler on a dead threa...

缩略信息是: sending message to a Handler on a dead thread 我是用IntentService时报的 稍微纤细一点儿的信息是: Handler (android.os.Handler) {215ddea8} sending message to a Handler on a dead thread。 在另一次在IntentService...

djh10000的博客 225

太美了!现代女主jk海军风穿搭四视图

哪个女孩子初高中的时候不买几套JK衣服啊,穿上完全是青春女孩。那还愣着干啥,不得也给你的漫剧女主也穿上!直接就是分享三套JK穿搭,红棕双麻花辫配经典水手服,是那种乖乖巧巧的元气学妹;粉色羊毛卷双马尾,搭配蝴蝶结和小挎包甜度直接拉满;还有灰棕色侧麻花辫,浅蓝上衣配黑色百褶裙,温柔里又带点小酷。下面把这三套角色的完整提示词分享出来,喜欢哪套就拿去参考,改改发型和配色,还能继续解锁新角色!

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 59

java.lang.RuntimeException: Handler{405c1180} sending message to a Handler on a dead thread

W/MessageQueue(4061): java.lang.RuntimeException: Handler{405c1180} sending message to a Handler on a dead thread W/MessageQueue(4061): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:196

jiangxl110的专栏 3160

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

安卓 Handler 消息机制之MessageQueue源码

handler机制之messagequeue源码

set_one_name的博客 790

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

IntentService中使用Toask报错sending message to a Handler on a dead thread

在自己IntentSevice继承类中的onHandleIntent方法中写Toast.makeText(getApplicationContext(), "sd不存在", Toast.LENGTH_SHORT).show();时不会有任何提示,logcat中提示“sending message to a Handler on a dead thread”错误。后从网上差报错...

weixin_34358365的博客 431

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java.lang.IllegalStateException sending message to a Handler on a dead thread 记录

backgroundThread.join(); //“等待该线程终止” backgroundThread = null; 修改后 backgroundThread.quit(); backgroundThread.interrupt(); backgroundThread = null; priva...

qq_35629609的博客 3872

Android之handler异步消息处理机制完全解析

开始进入正题,我们都知道,Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃。相信大家在日常的工作当中都会经常遇到这个问题,解决的方案应该也是早已烂熟于心,即创建一个Message对象,然后借助Handler发送出去,之后在Handler的handleMessage()方法中获得刚才发送的Message对象,然后在这里进行UI操作就不会再出现崩溃了。 这种处理...

LVXIANGAN的专栏 2053

使用AsyncTask引发RuntimeException:sending message to a Handler on a dead thread

报错出现在onPost方法的调用,从字面意思理解,明显是线程更新界面的问题,

lijianhy的专栏 3190

【Android 开发】: Android 消息处理机制之三: Handler 中 sendMessage() 源代码剖析

在前面的两件中我们学习了Handler和Message的基本使用方法[Android消息处理机制之Handler与Message],还有Message中obtain()的几种重载方法的使用方式的不同[Android消息处理机制 Message中 btain()源代码剖析],这一讲我们来学习一下Handler中的sendMessage()的几种重载方法的使用方式的不同以及它们的源代码的剖析

AHuier_Techblog :如果我不在写代码,你就 @me 4万+

【安卓R 源码】Hnadler 消息处理机制源码分析

1. Handler 的常用使用方法 Handler是安卓提供的一种消息机制。通常用于接受子线程发送的数据,并用此数据配合主线程更新UI。 比如,点击一个按钮去服务器请求数据。如果直接在主线程(UI线程)做请求操作,界面会出现假死现象, 如果长时间还没有完成的话,会收到Android系统的一个错误提示 "应用程序无响应(ANR)"。为什么呢?因为在Android里, App的响应能力是由Activity Manager和Window Manager系统服务来监控的. 通常在如下三种情况下会弹出ANR对.

mike_jun的博客 684

Android Handler 发送消息的线程安全问题

Handler在多线程发送消息到消息队列时是否会产生线程安全问题。 下面对发送流程进行分析 public final boolean sendEmptyMessage(int what) { return sendEmptyMessageDelayed(what, 0); } public final boolean sendEmptyMessageDela

zhangxuanchen的博客 1527
上一篇: 如何在ListPreference中改变AlertDialog的文字大小?
下一篇: java.lang.RuntimeException: 将消息发送到死的线程上处理程序的处理程序 (android.os.Handler)
闲暇部落
博客等级 码龄12年 2779粉丝 215原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲暇部落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值