handler消息传递机制

1)、Handler是一种异步回调机制,使用它,可以在完成一个很长时间的任务后做出相应的通知。

主要作用:

1)执行计划任务,可以在预定的时间执行某些任务,可以模拟定时器

2)线程间通信。在Android的应用启动时,会创建一个主线程,主线程会创建一个
消息队列来处理各种消息。当你创建子线程时,你可以在你的子线程中拿到父线程中
创建的Handler 对象,就可以通过该对象向父线程的消息队列发送消息了。由于Android
要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面。

Android消息机制中引入了消息池。Handler创建消息时首先查询消息池中是否有消息存在,如果有直接从消息池中取得,如果没有则重新初始化一个消息实例。使用消息池的好处是:消息不被使用时,并不作为垃圾回收,而是放入消息池,可供下次Handler创建消息时使用。消息池提高了消息对象的复用,减少系统垃圾回收的次数。

2)、looper、Handler、Message Queue

<1>、Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。读到消息后吧消息交给发送该消息的handler处理。Looper类的构造器是私有的,程序员无法通过构造器来创建looper对象。程序在初始化looper是会创建一个与之关联的messageQueue。一个线程只能有一个looper和messageQueue。
<2>、Handler: Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。即主要作用为在新线程中发送消息,在主线程中获取和处理消息。自定义handler类可继承handler类再复写handleMessage(Message msg)方法来 处理接收到的消息。

其他常用方法有:



<3>、Message Queue(消息队列):先进先出的消息队列。

 

3)、ui主线程中,系统已经初始化了一个looper对象,因此程序直接创建handler即可,然后就可以通过handler来收发和处理信息。UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper,该Looper与UI主线程一一对应。使用ThreadLocal的目的是保证每一个线程只创建唯一一个Looper。之后其他Handler初始化的时候直接获取第一个Handler创建的Looper。Looper初始的时候会创建一个消息队列MessageQueue。至此,主线程、消息循环、消息队列之间的关系是1:1:1。

4)、程序员自己启动的子线程中必须自己创建(prepare()方法)looper对象并启动(loop()方法,loop()方法使用一个死循环不断取出messageQueue中的消息,并将取出的消息对应的handler进行处理)它,否则会报“java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()”错误。

注意:一个线程可有多个handler,但只能有一个looper和messageQueue


猜你喜欢

转载自blog.csdn.net/u013789656/article/details/80926958