Android之消息队列和 Looper面试题
一、什么是消息队列
消息队列在 android 中对应 MessageQueue 这个类,顾名思义,消息队列中存放了大量的消息(Message)
二、什么是消息
消息(Message)代表一个行为(what)或者一串动作(Runnable),有两处会用到 Message:Handler 和 Messenger
三、什么是 Handler 和 Messenger
Handler 大家都知道,主要用来在线程中发消息通知 ui 线程更新 ui。Messenger 可以翻译为信使,可以实现进程间通信(IPC),Messenger 采用一个单线程来处理所有的消息,而且进程间的通信都是通过发消息来完成的,感觉不能像 AIDL 那样直接调用对方的接口方法(具体有待考证),这是其和 AIDL 的主要区别,也就是说 Messenger 无法处理多线程,所有的调 用 都 是 在 一 个 线 程 中 串 行 执 行 的 。 Messenger 的 典 型 代 码 是 这 样 的 : new Messenger(service).send(msg),它的本质还是调用了 Handler 的 sendMessage 方法。
四、什么是 Looper
Looper 是循环的意思,它负责从消息队列中循环的取出消息然后把消息交给目标处理。
五、线程有没有 Looper 有什么区别?
线程如果没有 Looper,就没有消息队列,就无法处理消息,线程内部就无法使用 Handler。 这就是为什么在子线程内部创建 Handler 会报错:"Can't create handler inside thread that has not called Looper.prepare()"
六、消息队列和 Looper 的工作机制
#android面试#一个 Handler 会有一个 Looper,一个 Looper 会有一个消息队列,Looper 的作用就是循环的遍历消息队列,如果有新消息,就把新消息交给它的目标处理。每当我们用 Handler 来发送消息,消息就会被放入消息队列中,然后 Looper 就会取出消息发送给它的目标 target。一般情况,一个消息的 target 是发送这个消息的 Handler,这么一来,Looper 就会把消息交给Handler 处理,这个时候 Handler 的 dispatchMessage 方法就会被调用,一般情况最终会调用Handler 的 handleMessage 来处理消息,用 handleMessage 来处理消息是我们常用的方式。