面试官经常问的一个问题:谈谈你对Handle机制的理解,我就谈谈我的理解;
1、Handle机制的主要成员Looper、Handle、Message介绍
会有同学问起,怎么没有MessageQueue(消息队列);MessageQueue包含在Lopper里面是由Lopper创建的;
结论:
Lopper负责从MessageQueue的栈顶不断取消息(Message)发送给Handle由Handle的handleMessage()方法处理;
Handle负责把封装好的Message发送到MessageQueue里面;
Message封装的整个消息体;
每一个线程有且只有一个Lopper,每一个Lopper主要是prepare()和loop()两个方法;主线程(UI线程)创建Handle来处理消息不需要手动调用prepare()和loop(),子线程就必须手动
调用这两个方法;Lopper.prepare()创建了一个MessageQueue(消息队列);记得Lopper.prepare()只能调用一次,否则会报
RuntimeException("Only one Looper may be created per thread");
Lopper.loop() , Lopper开始循环的工作,从MessageQueue(消息队列)取消息;必须先调用Lopper.prepare()再调用Lopper.loop(),否则会报
RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.")
Message创建对象尽量不要使用new Message();使用Message.obtain()或handle.obtainMessage()(这两个方法从源码来看效果一样)创建Message对象(可以复用消
息队列里面的闲置对象);这里有点儿像设计模式的享元模式,设计模式以后再和大家一起学习!