角色描述:
Message:消息对象,Message Queue中的存放的对象。
一个Message Queue中包含多个Message。Message实例对象的取得,通常使用Message类里的静态方法obtainMessage();它的创建并不一定是直接创建一个新的实例,而是先从Message Pool(消息池)中看有没有可用的Message实例,存在则直接取出返回这个实例。如果Message Pool中没有可用的Message实例,则才用给定的参数创建一个Message对象。调用removeMessages()时,将Message从Message Queue中删除,同时放入到Message Pool中。
Looper:是MessageQueue的管理者。
每一个MessageQueue都不能脱离Looper而存在。每一个Looper对象和一个线程关联。通过调用Looper.myLooper()可以获得当前线程的Looper对象。
Handler:消息的处理者。
handler负责将需要传递的信息封装成Message,消息通过handler对象的sendMessage()来将该条Message放入MessageQueue中。当Looper对象看到MessageQueue中含有Message,取出该条消息发送给handler,进而调用相应的handler对象的handleMessage()方法对其进行处理。
工作原理:
我们只要将最新的数据放到Handler所关联的Looper的MessageQueue中,线程(UI线程或非UI线程)的Looper一直在进行Loop操作从MessageQueue中读取符合要求的Message给属于它的target即 Handler来处理!所以啊,一旦有符合要求的Message,就第一时间将Message交给该Handler来处理!
简单一点说就是:
线程(UI线程或非UI线程)提供MessageQueue,Looper从其中读Message,然后交由Message自己的Handler来处理!最终被Handler中的handlMessag(Message msg)方法处理!如下图所示:
小结:
一个Looper对应一个MessageQueue
一个线程对应一个Looper