本篇文章是根据Android中消息系统模型和Handler Looper的内容进行自己理解的修改与添加
通过Android文档描述的信息来看:
这里主要介绍了Handler的两个主要作用:
1.发送和处理消息或Runable在未来的某个时间点上。
2.使动作在不同的线程中执行。
谷歌为我们提供了一些消息发送方法: post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), and sendMessageDelayed(Message, long)。
post系列的方法针对的是Runable对象,Runable是一个接口,所有实现了这个接口的对象都覆写了run()方法。
sendMessage系列的方法针对的Message对象,这个msg对象可以包含一个Bundle数据,来通过Handler的handleMessage(Message)方法来处理。
当你通过这两种方式发送消息后,你既可以立即处理这个消息,也可以添加一个延时。
当一个应用程序运行时,主线程会自动运行一个消息队列来维护顶层相关的对象,如Activity、broadcast receiver等。你也可以自己创建一个Thread来和主线程打交道通过Handler,即前面所提的post或者sendMessage方法。
可以说Handler和消息分不开关系,我们来看看消息系统的组成:
消息原型 消息队列 发送消息 消息循环 消息获取 消息派发 消息处理
实际上Android将这七种部分封装并抽象了一下,变成了四个独立的部分:
Handler,Message,MessageQueue,Looper
Handler:发送和处理消息
Message:消息本身
MessageQueue:消息队列,Message都有序的排列在这里
Looper:消息循环
这里有一幅图描述了他们之间的关系:
Thread中,除了主UI线程创建的时候会自动创建一个Looper外,缺省情况下Thread不会创建Looper,需要我们手动创建。这里Android为我们提供了一个辅助类HandlerThread,
这个线程已经自动帮我们创建好了Looper。
Looper实现了消息的循环和消息的派发,也就是派发给handlerMessage来处理消息。
MessageQueue消息队列有Looper持有,但消息的添加则是通过Handler的post/sendMessage
所以消息系统模型的核心就是Looper。消息循环和消息队列都是由Looper建立的。
一个Thread中Looper是唯一的,一个Thread对应一个Looper。建立Handler的Looper属于哪个Thread,则Handler也属于哪个Thread(这里可能有些不好理解,可以自行浏览下Handler源码)。
Handler源码中提供了许多构造方法。创建一个Handler对象,如果构造方法中不指定一个新Looper的话,就说明次Handler仍然属于当前线程。例如在主UI线程中mHandler = new Handler();这个mHandler仍属于主UI线程。但是MyHandler handler = new MyHandler(handlerThread.getLooper());这个handler对象就属于handlerThread这个线程的了,因为传进来的Looper属于handlerThread。在这里面处理的消息(handlerMessage)都是异步的,即在handlerThread线程中处理的。
故建立Thread消息系统,就是将Thread的Looper交给Handler去打理,实现消息系统模型,完成消息的异步处理。
下一章我们会通过代码来建立一个消息系统。