android Handler机制(个人理解)

来源:互联网 发布:数据科学师的职业规划 编辑:程序博客网 时间:2024/06/05 19:36

参考:http://blog.sina.com.cn/s/blog_62a6ef3e01018oju.html

android 多线程主要涉及的类有 Looper 、MessageQueue、Handler、Message

1、消息处理的整个流程是:首先是Handler类,这个类我们可以当成是线程中的一个专门的消息处理机构。在这个机构中它可以创建、发送、处理消息。

既然是消息处理机构那么在每个线程中都可以有其他线程的handler对象,它们在别的线程中收集资料整理成Message,然后发送到自己的线程中进行处理。自己线程这边收到消息后就会交由MessageQueue来排序存储;

MessageQueue类用于表示消息队列. 队列中的每一个Message都有一个when字段, 这个字段用来决定Message应该何时出对处理. 消息队列中的每一个Message根据when字段的大小由小到大排列, 排在最前面的消息会首先得到处理, 因此可以说消息队列并不是一个严格的先进先出的队列.接着就由Looper类从MessageQueue中取出消息交由Handler来处理。

2、这几个类之间的关系是:

    Handler处理消息需要Looper类从消息队列(MessageQueue)中取,消息队列(MessageQueue类)是通过Looper来创建的

    每个线程最多只能有一个消息队列, android中UI线程默认具有消息队列, 但非UI线程在默认情况下是不具备消息队列的.

    如果需要在非UI线程中开启消息队列, 需要调用Looper.prepare()方法, 在该方法的执行过程中会创建一个Looper对象, 而Looper的构造函数中会创建一个MessageQueue instance(Looper的构造函数是私有的, 在Looper类之外无法创建其对象). 此后再为该线程绑定一个Handler instance, 然后调用Looper.loop()方法, 就可以不断的从消息队列中取出消息和处理消息了. Looper.myLoop()方法可以得到线程的Looper对象, 如果为null, 说明此时该线程尚未开启消息队列.

消息的生成:

我们知道Message类用于表示消息那么生成消息即 Message对象的方式有:

a、直接初始化 Message msg=new Message()

b、通过Handler对象(定义Handler对象为handle)

    Message msg=handle.obtainMessage();

    Message msg=handle.obtainMessage(int what);

    Message msg=handle.obtainMessage(int what,Object object);

     Message msg=handle.obtainMessage(int what,int arg1,int arg2);

     Message msg=handle.obtainMessage(int what,int arg1,int arg2,Object obj);

    关于这些参数的解释:

    Message对象可以通过 arg1、arg2、obj字段携带数据,此外还有许多字段如:what字段表示code,即这个消息具体是什么类型的消息。每个what都在其handler的namespace中,我们只需要确保同一个handler处理的消息的what值不同。

注:Toast或者Dialog中都有一个Handler的成员变量,在初始化时都会跟着初始化,而Toast或者Dialog中的Handler都需要一个Looper,所以需要在包含该Toast或者Dialog的线程中(如下面的Timer线程)初始化Looper。Looper.prepare();****

     

原创粉丝点击