AI智能
改变未来

Android的handler理解

一、Handler的定义:

主要接受子线程发送的数据, 并用此数据配合主线程更新UI。

Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,也就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作。 它能实现任意两个线程的数据传递。

handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),它有两个作用:
  (1)安排消息或Runnable 在某个主线程中某个地方执行;
  (2)安排一个动作在不同的线程中执行。 

子类需要继承Hendler类,并重写handleMessage(Message msg) 方法, 用于接受线程数据。 

[code]    * 通常我们在主线程中创建一个Handler,* 然后重写该Handler的handlerMessage方法,可以看到该方法传入了一个参数Message,* 该参数就是我们从其他线程传递过来的信息。** 我们在来看下子线程中如何传递的信息,子线程通过Handler的obtainMessage()方法获取到一个Message实例,* 我们来看看Message的几个属性:* Message.what------------------>用来标识信息的int值,通过该值主线程能判断出来自不同地方的信息来源* Message.arg1/Message.arg2----->Message初始定义的用来传递int类型值的两个变量* Message.obj------------------->用来传递任何实例化对象* 最后通过sendMessage将Message发送出去。** Handler所在的线程通过handlerMessage方法就能收到具体的信息了,如何判断信息的来源呢?当然是通过what值啦。

在使用handler进行线程间通信时:

在一个线程创建Handler。另一个形成通过持有该Handler的应用调用sendmessage发送消息

在子线程实例化的时候需要调用Looper.perpare(),不然会报错。

sendMessage的关键在于enqueueMessage(),其内部调用了messageQueue的enqueueMessage方法。

Message的发送实际是放入到了Handler对应线程的MessageQueue中

在使用handler的时候,在handler所创建的线程需要维护一个唯一的Looper对象, 每个线程对应一个Looper,每个线程的Looper通过ThreadLocal来保证。
Looper对象的内部又维护有唯一的一个MessageQueue,所以一个线程可以有多个handler,
但是只能有一个Looper和一个MessageQueue。
Message在MessageQueue不是通过一个列表来存储的,而是将传入的Message存入到了上一个
Message的next中,在取出的时候通过顶部的Message就能按放入的顺序依次取出Message。
Looper对象通过loop()方法开启了一个死循环,不断地从looper内的MessageQueue中取出Message,
然后通过handler将消息分发传回handler所在的线程。
 

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Android的handler理解