Handler
Handler常见问题
- 说一说Android的消息机制
- Handler主要用于跨线程通讯,主要涉及到的几个主要的类:
- Handler:消息处理者,主要负责消息的发送(handler.enqueueMessage)和消息的处理(handleMessage)
- Looper:可以理解为消息泵,不断的循环执行(Looper.loop),主要负责消息的分发
- MessageQueue:消息队列,主要负责消息的管理,向消息池投递消息(MessageQueue.enqueueMessage)和取出消息池的数据(MessageQueue.next)交由target(Handler)处理
- Message:消息,信息传递的单位,主要分为硬件消息和软件创建的消息
- 总:Looper 有一个 MessageQueue 消息队列;MessageQueue 有一组待处理的 Message;Message 中有一个用于处理消息的 Handler;Handler 中有 Looper 和 MessageQueue。参考图解。
- Handler 是如何与线程关联的?
- Handler的线程关联主要通过Looper实现的,创建Handler之前需要创建Looper,而在Looper.prepare 方法中借助ThreadLocal实现了与当前线程的绑定,而Looper.loop又控制取出消息交给Handler处理
- Handler 发出去的消息是谁管理的?
- MessageQueue, handler通过send/post发送的消息,最终会调用到MessageQueue.enqueueMessage方法,并由Looper取出(Looper.loop中MessageQueue.next)交由Handler处理(Looper.loop中msg.target.dispatchMessage)
- 消息又是怎么回到 handleMessage() 方法的?
- 通过Looper.loop ,Looper取出(Looper.loop中MessageQueue.next)交由Handler处理(Looper.loop中msg.target.dispatchMessage)
- 线程的切换是怎么回事?
- 线程的转换由Looper实现,handleMessage由所在线程由Looper.loop调用者所在的线程决定的
- 一个线程可以有几个 Looper、几个 MessageQueue 和几个 Handler?
- 总结:一个Looper,一个MessageQueue和多个Handler
- Looper创建时会通过ThreadLocal关联当前的线程,Looper 类利用了 ThreadLocal 的特性,保证了每个线程只存在一个 Looper 对象,一个Looper内部创建一个MessageQueue,可以有多个Handler
- 可以在子线程创建Handler吗?需要注意什么?
- 可以,但是需要在创建之前创建Looper
- Looper.prepare()–>new Handler
- Looper 死循环为什么不会导致应用卡死,会消耗大量资源吗?
- MessageQueue是什么数据结构?
- 单链表
- handler.postDelayed() 函数延时执行计时是否准确?
- 不准确,当上一个任务存在耗时操作时
- 你对 IdleHandler 有多少了解?
- TODO
- HandlerThread的了解?
- HandlerThread继承自Thread,是一个可以直接使用Handler的Thread,内部通过run方法已经调用了Looper.prepare和Looper.loop方法,可以直接通过HandlerThread创建Handler,由于 HandlerThread 的run方法是一个无限循环,因此当不需要使用的时候通过quit或者quitSafely方法来终止线程的执行。
- Message的Obtain方法了解多少,怎么维护消息池?
- 创建Message时,通过Message.obtain或者Handler.obtainMessage方法,不建议直接new Message,因为Message内部维护了一个消息池,默认消息池大小50,obtain方法从消息池中返回一个新的Message实例,避免重新分配