使用Handlerf发送消息或使用Handler轮询时,报错IllegalStateException:This message is already in use.;
java.lang.IllegalStateException: { when=-107ms what=9 obj=com.saicmaxus.maxuslife.model.CarInfo@be47330 target=com.cc.fragment.OwnerServiceFragment$13 } This message is already in use.
很明显,它的意思是这个消息正在使用中,不可以使用;
Message msgCarcarstatus = new Message();
msgCarcarstatus.obj = carInfo;
msgCarcarstatus.what = CARCARSTATUSUPDATAWHAT;
mHandler.sendMessageDelayed(msgCarcarstatus,1000*15);
// mHandler.sendMessageDelayed(msg,1000*15); //IllegalStateException:This message is already in use.
上面代码所示,我们再从新new Message传过去就可以了;
如果感觉这样每次都new效果不过不好,还可以这样使用,Message message = YourHandler.obtainMessage();不会重复创建Message,节省内存开销;
Message msgCarcarstatus = mHandler.obtainMessage();
msgCarcarstatus.obj = carInfo;
msgCarcarstatus.what = CARCARSTATUSUPDATAWHAT;
mHandler.sendMessageDelayed(msgCarcarstatus,1000*15);
// mHandler.sendMessageDelayed(msg,1000*15); //IllegalStateException:This message is already in use.
看完整代码:
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what == CARCARSTATUSUPDATAWHAT){
CarInfo carInfo = (CarInfo) msg.obj;
showCarCarstatus(carInfo.get1(),carInfo.get2(),true);
//轮询
Message msgCarcarstatus = mHandler.obtainMessage();
msgCarcarstatus.obj = carInfo;
msgCarcarstatus.what = CARCARSTATUSUPDATAWHAT;
mHandler.sendMessageDelayed(msgCarcarstatus,1000*15);
// mHandler.sendMessageDelayed(msg,1000*15); //IllegalStateException:This message is already in use.
}
}
};
//发送消息
private final int CARCARSTATUSUPDATAWHAT = 9;
//定时刷新
Message msg = new Message();
msg.obj = ownerList.get(position);
msg.what = CARCARSTATUSUPDATAWHAT;
mHandler.sendMessageDelayed(msg,1000*15);
移除标记是what的消息:mHandler.removeMessages(CARCARSTATUSUPDATAWHAT);
移除全部的消息:mHandler.removeCallbacksAndMessages(null);
附源码:
/**
* Returns a new {@link android.os.Message Message} from the global message pool. More efficient than
* creating and allocating new instances. The retrieved message has its handler set to this instance (Message.target == this).
* If you don't want that facility, just call Message.obtain() instead.
*/
public final Message obtainMessage()
{
return Message.obtain(this);
}
/**
* Same as {@link #obtain()}, but sets the value for the <em>target</em> member on the Message returned.
* @param h Handler to assign to the returned Message object's <em>target</em> member.
* @return A Message object from the global pool.
*/
public static Message obtain(Handler h) {
Message m = obtain();
m.target = h; return m;
}
/**
* Return a new Message instance from the global pool. Allows us to
* avoid allocating new objects in many cases.
*/
public static Message obtain() {
synchronized (sPoolSync) {
if (sPool != null) {
Message m = sPool;
sPool = m.next;
m.next = null;
m.flags = 0; // clear in-use flag
sPoolSize--;
return m;
}
}
return new Message();
}
注释说:从全局池返回一个新的Message实例。允许我们避免在很多情况下分配新对象
大概意思就是:如果MessagePool中存在Message,就把这个Message中的内容清空后返回;如果MessagePool中不存在message,就新建一个Message;所以,不管怎样我们拿到的Message都是一个全新的,都需要重新去赋值;
使用Handlerf发送消息或使用Handler轮询时,报错IllegalStateException:This message is already in use.;的更多相关文章
- 基于PNotify的消息提示Demo(轮询)
需求:有些任务需要定时更新,获取最新的消息,这样就需要定时轮询,再者需要一种友好的提示. 以下就是使用PNotify插件的消息提示: 1.HTML代码 <!DOCTYPE html> &l ...
- hander消息机制原理(looper轮询监听机制)
基本原理 线程中调用Handler.sendMsg()方法(参数是Message对象),将需要Main线程处理的事件 添加到Main线程的MessageQueue中,Main线程通过MainLoope ...
- 轮询、长轮询和websocket
一.轮询 在一些需要进行实时查询的场景下应用比如投票系统: 大家一起在一个页面上投票 在不刷新页面的情况下,实时查看投票结果 1.后端代码 from flask import Flask, rende ...
- 轮询以及webSocket与socket.io原理
概述: 首先,我们知道,起初的http协议只是为了能够进行通信而被创造出来(也就是请求-响应的过程).并没有双向通信这一说,后面随着历史业务的需求,人们使用轮询http来解决双向通信也就是使用xhr或 ...
- Handler发送消息
Handler发送消息小结 字数283 阅读210 评论0 喜欢1 obtainMessage()得到一个Message对象. 创建一个Message然后发送是这么写的: Message msg = ...
- Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)
keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主 ...
- Android消息机制探索(Handler,Looper,Message,MessageQueue)
概览 Android消息机制是Android操作系统中比较重要的一块.具体使用方法在这里不再阐述,可以参考Android的官方开发文档. 消息机制的主要用途有两方面: 1.线程之间的通信.比如在子线程 ...
- Python RabbitMQ消息分发轮询
1.收消息:一对多,默认依次轮询的发给每个消费端. 2.消息确认:默认RabbitMQ不会设置no_ack=Ture,意思是,当生产者给消费者发送发送消息时,消费者处理这个消息,处理完后会手动确认发送 ...
- Socket.io各个发送消息的含义【发送对象范围】
Socket.io各个发送消息的含义 // send to current request socket client socket.emit('message', "this is a ...
随机推荐
- mysql之 mysql_config_editor/login-path 登录密码保护
login-path是MySQL5.6开始支持的新特性.通过借助mysql_config_editor工具将登陆MySQL服务的认证信息加密保存在.mylogin.cnf文件(默认位于用户主目录) . ...
- webpack 学习资料
webpack 学习资料 webpack 学习资料 网址 webpack 中文版 https://webpack.docschina.org/configuration/dev-server/
- tp5闭包子查询传参方法
在channel表中查询status,channel_id,channel_name,account_level这些字段,且这些字段的channel_id不在adv_id为$id的表adv_chann ...
- Linux Tomcat自启动
1. 修改/etc/rc.d/文件夹下的rc.lcoal 添加如下内容 export JAVA_HOME=/usr/java/jdk/jdk1.7.0_80 export JRE_HOME=$JAVA ...
- Hadoop 完全分布式部署
完全分布式部署Hadoop 分析: 1)准备3台客户机(关闭防火墙.静态ip.主机名称) 2)安装jdk 3)配置环境变量 4)安装hadoop 5)配置环境变量 6)安装ssh 7)集群时间同步 7 ...
- Hanlp等七种优秀的开源中文分词库推荐
Hanlp等七种优秀的开源中文分词库推荐 中文分词是中文文本处理的基础步骤,也是中文人机自然语言交互的基础模块.由于中文句子中没有词的界限,因此在进行中文自然语言处理时,通常需要先进行分词. 纵观整个 ...
- Qt中的标准对话框之QMessageBox
1. Qt标准对话框 Qt为开发者提供了一些可复用的对话框类型 Qt提供的可复用对话框全部继承自QDialog类 Qt中的对话框的使用方式和QDialog完全一致 2. 标准对话框的使用步骤 ①定义对 ...
- java中三种for循环之间的对比
普通for循环语法: for (int i = 0; i < integers.length; i++) { System.out.println(intergers[i]); } foreac ...
- 使用MATLAB对数据进行位操作以及RGB图片显示
fd = fopen('video_test_pattern_avalon_generator_source_data.txt'); //打开像素源文件 A = fscanf(fd,'%d'); // ...
- [蓝桥杯]ALGO-51.算法训练_Torry的困惑(基本型)
题目描述: 问题描述 Torry从小喜爱数学.一天,老师告诉他,像2...……这样的数叫做质数.Torry突然想到一个问题,前10...……个质数的乘积是多少呢?他把这个问题告诉老师.老师愣住了,一时 ...