Handler消息机制

  Handler消息机制主要是Handler、Message、MessageQueue、Looper这四个类配合使用实现的。

  • Message:Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。Message可以使用what字段、arg1字段和arg2字段来携带(int)整型数据,还可以使用obj字段携带一个Object对象。
  • Handler:主要用于发送和接收到消息进行处理。发送消息一般是使用Handler的sendMessage()等几个方法来发送,而发出去的消息经过一系列的处理后,最终会传递到Handler的handleMessage()方法中。
  • MessageQueue:MessageQueue是消息队列的意思,它主要是用于存放所有通过Handler发送的消息。这部分消息会一直存在于消息队列中,等待被处理。每个线程只会有一个MessageQueue对象。
  • Looper:Looper是每个线程中的MessageQueue的管家,调用Looper的loop()方法后,就会进入到一个无限循环中,每当发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的handleMessage()方法。每个线程中只会有一个Looper对象。

异步消息处理流程
  首先需要在主线程中创建一个Handler对象,并重写handleMessage()方法。然后当子线程中需要更新UI操作时,就创建一个Message对象,并通过Handler将这条消息发送出去。之后这条消息会被添加到MessageQueue的队列中等待被处理,而Looper则会一直尝试从MessageQueue中取出待处理消息,通过Handler的dispatchMessage()方法的回调,最后分发回Handler的handleMessage()方法中。由于Handler是在主线程中创建的,所以此时handleMessage()方法中的代码也会在主线程中运行,就可以在这里进行UI操作了。

注意:

  • 不能在子线程中创建Handler;
  • 不能在子线程中更新UI;
  • Handeler的作用:(1).在非UI线程中完成耗时操作,在UI线程中去更新UI;(2).可以在主线程中发送延时消息;
  • 只能在UI线程中去更新UI原因:(1).解决多线程并发问题;(2).提高界面更新的性能问题;(3).架构设计的简单;