当主线程队列,如果处理一个消息超过5秒,android 就会抛出一个 ANP(无响应)的消息

来源:互联网 发布:如何查看淘宝店铺等级 编辑:程序博客网 时间:2024/06/05 06:44

当主线程队列,如果处理一个消息超过5秒,android 就会抛出一个 ANP(无响应)的消息

 

 http://www.cnblogs.com/youxilua/archive/2011/11/25/2263825.html

Handlers

为什么要使用Handlers?

    因为,我们当我们的主线程队列,如果处理一个消息超过5秒,android 就会抛出一个 ANP(无响应)的消息,所以,我们需要把一些要处理比较长的消息,放在一个单独线程里面处理,把处理以后的结果,返回给主线程运行,就需要用的Handler来进行线程建的通信,关系如下图;

     mainthread

下面是Handler,Message,Message Queue 之间的关系图

Handlers

这个图有4个地方关系到handlers

1, 主线程(Main thread)

2, 主线程队列(Main thread queue)

3,Hanlder

4,Message

   上面的四个地方,主线程,和主线程的队列我们无需处理,所以,我们主要是处理Handler 和 Message 之间的关系.

   我们每发出一个Message,Message就会落在主线程的队列当中,然后,Handler就可以调用Message绑定的数据,对主线程的组件进行操作.

Message

作为handler接受的对象,我们有必要知道Message这个数据类型是个怎样的数据类型

从官方文档中我们可以知道message 关于数据的字段

  public int what public int arg1 public int arg2 public Object obj 

从上面的表格可以看出,message 提供了一个对象来存储对象,而且,还提供了三个int字段用来存储少量int类型

当然,除了以上三个Message 自有的字段外,我们还可以通过setData(Bundle b),来存储一个Bundle对象,来存储更丰富的数据类型,例如,图片等等.

在初始化我们的message的时候就可以为我们的Message默认字段赋值,注意赋值顺序!!!

?
1
2
3
4
5
6
7
8
9
Message msg = obtainMessage();
//设置我们what 字段的初值,注意顺序!!!
Message msg = mHandler.obtainMessage(int what);
//下面同理
Message msg = mHandler.obtainMessage(int what,Object object);
Message msg = mHandler.obtainMessage(int what,int arg1,int arg2);
Message msg = mHandler.obtainMessage(int what,int arg1,int arg2, Object obj
);

 

原创粉丝点击