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.;的更多相关文章

  1. 基于PNotify的消息提示Demo(轮询)

    需求:有些任务需要定时更新,获取最新的消息,这样就需要定时轮询,再者需要一种友好的提示. 以下就是使用PNotify插件的消息提示: 1.HTML代码 <!DOCTYPE html> &l ...

  2. hander消息机制原理(looper轮询监听机制)

    基本原理 线程中调用Handler.sendMsg()方法(参数是Message对象),将需要Main线程处理的事件 添加到Main线程的MessageQueue中,Main线程通过MainLoope ...

  3. 轮询、长轮询和websocket

    一.轮询 在一些需要进行实时查询的场景下应用比如投票系统: 大家一起在一个页面上投票 在不刷新页面的情况下,实时查看投票结果 1.后端代码 from flask import Flask, rende ...

  4. 轮询以及webSocket与socket.io原理

    概述: 首先,我们知道,起初的http协议只是为了能够进行通信而被创造出来(也就是请求-响应的过程).并没有双向通信这一说,后面随着历史业务的需求,人们使用轮询http来解决双向通信也就是使用xhr或 ...

  5. Handler发送消息

    Handler发送消息小结 字数283 阅读210 评论0 喜欢1 obtainMessage()得到一个Message对象. 创建一个Message然后发送是这么写的: Message msg = ...

  6. Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)

    keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主 ...

  7. Android消息机制探索(Handler,Looper,Message,MessageQueue)

    概览 Android消息机制是Android操作系统中比较重要的一块.具体使用方法在这里不再阐述,可以参考Android的官方开发文档. 消息机制的主要用途有两方面: 1.线程之间的通信.比如在子线程 ...

  8. Python RabbitMQ消息分发轮询

    1.收消息:一对多,默认依次轮询的发给每个消费端. 2.消息确认:默认RabbitMQ不会设置no_ack=Ture,意思是,当生产者给消费者发送发送消息时,消费者处理这个消息,处理完后会手动确认发送 ...

  9. Socket.io各个发送消息的含义【发送对象范围】

    Socket.io各个发送消息的含义   // send to current request socket client socket.emit('message', "this is a ...

随机推荐

  1. Spring Boot 历史

    2012年10月,Mike Youngstrom在Spring jira中创建了一个功能需求,要求在Spring框架中支持无容器Web应用程序体系结构.他建议通过main方法引导的Spring容器内配 ...

  2. 如何优化JavaScript的构造函数

    首先看一个构造函数User,我们在调用User创建一个实例的的时候,一般都是要写上new操作符的.在这里说明一下,如果使用new关键字调用构造函数,那么构造函数里面的this总是是指向一个全新的对象( ...

  3. ThinkPHP5与JQuery实现图片上传和预览效果

    内容正文 这篇文章主要为大家详细介绍了thinkphp上传图片功能,和jquery预览图片效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 先上效果图: html和js代码如下: <!DO ...

  4. python selenium-webdriver 标签页切换(十五)

    测试过程中有时候会遇到点击某个按钮或者链接会弹出新的窗口,这时候我们的操作的页面还保持着最初打开页面,但是此时我们需要操作新打开的页面上的功能,这个时候我们需要切换一下标签页 . 其实页面的切换与fr ...

  5. Jenkins进阶-部署Web项目到远程tomcat(7)

    之前讲到的是如何构建一个项目,并且将代码进行编译.打包,那么打包完成最后的结果就需要发布到应用服务器,将项目部署成功.在之前的项目中我们采用的shell脚本来部署,下面讲解通过Jenkins部署web ...

  6. MySQL的吞吐量

    MySQL 的QPS吞吐量或者说TPS与很多因素有关,例如CPU.内存以及硬盘等. <高性能MySQL>第三版 1.5小节对各个版本的MySQL进行了测试,其结果如下. 测试机器 测试机器 ...

  7. WPF Demo13 GridSplitter

    <Window x:Class="Commands.MainWindow" xmlns="http://schemas.microsoft.com/winfx/20 ...

  8. windows server core 设置shell 及切换

    hkey_local_machine/software/Microsoft/windows nt/currentversion/winlogon/shell 1)windows server 2012 ...

  9. 跟着未名学Office - 熟练使用WORD

    目录 第一章.Word之编辑篇. 1 第一节 页面布局... 1 第二节 格式编辑... 1 第三节 表.图.域... 5 第四节 审阅.保护... 7 第五节 *插入对像... 9 第二章.Word ...

  10. JAVA开源B2C系统

    前言 最近有人想面向境外销售商品,但是又不想依托于亚马逊这些平台,于是找我来帮忙想弄个B2C系统.因为刚开始只是打算试试水,也就不打算投入多少成本了.所以这边就考虑使用开源的B2C系统来直接使用了. ...