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. Update 20180317

    Date todo 20180317 Opencv a)         Install opencv+python+ide (http://opencv-python-tutroals.readth ...

  2. COM,SOM, QT, GObject, ObjectiveC

    COM,SOM, QT, GObject, ObjectiveC https://en.wikipedia.org/wiki/IBM_System_Object_Model#Comparison_of ...

  3. Redis Cluster 4.0高可用集群安装、在线迁移操作记录

    之前介绍了redis cluster的结构及高可用集群部署过程,今天这里简单说下redis集群的迁移.由于之前的redis cluster集群环境部署的服务器性能有限,需要迁移到高配置的服务器上.考虑 ...

  4. css加载字体跨域问题

    刚才碰到一个css加载字体跨域问题,记录一下.站点的动态请求与静态文件请求是不同的域名的.站点的域名为 www.domain.com,而静态文件的域名为 st.domain.com.问题:页面中加载c ...

  5. centos7 docker私有仓库搭建

    习Docker的过程中Docker的私有仓库一直没能成功,就是因为CentOS 6.x和CentOS 7默认引入了支持https认证,每次在push和pull的时候都会报错,今天是周末,利用一天的时间 ...

  6. Scrapy 爬虫日志中出现Forbidden by robots.txt

    爬取汽车之家数据的时候,日志中一直没有任何报错,开始一直不知道什么原因导致的,后来细细阅读了下日志发现日志提示“Forbidden by robots.txt”,Scrapy 设置文件中如果把ROBO ...

  7. spring-IOC容器(一)

    ApplicationContext 代表IOC容器(控制反转) ApplicationContext的主要实现类: ——ClassPathXmlApplicationContext:从类路径下加载配 ...

  8. 中文自然语言处理工具hanlp隐马角色标注详解

    本文旨在介绍如何利用HanLP训练分词模型,包括语料格式.语料预处理.训练接口.输出格式等. 目前HanLP内置的训练接口是针对一阶HMM-NGram设计的,另外附带了通用的语料加载工具,可以通过少量 ...

  9. 安装老版本redis .NET 客户端

    https://github.com/ServiceStackV3/ServiceStackV3 PM> Install-Package ServiceStack -Version 3.9.71 ...

  10. what's the difference between grouping and facet in lucene 3.5

    I  found in lucene 3.5 contrib folder two plugins: one is grouping, the other is facet. In my option ...