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 的工作机制

一个 Handler 会有一个 Looper,一个 Looper 会有一个消息队列,Looper 的作用就是循环的遍历消息队列,如果有新消息,就把新消息交给它的目标处理。每当我们用 Handler 来发送消息,消息就会被放入消息队列中,然后 Looper 就会取出消息发送给它的目标 target。一般情况,一个消息的 target 是发送这个消息的 Handler,这么一来,Looper 就会把消息交给Handler 处理,这个时候 Handler 的 dispatchMessage 方法就会被调用,一般情况最终会调用Handler 的 handleMessage 来处理消息,用 handleMessage 来处理消息是我们常用的方式。

#android面试#
全部评论

相关推荐

MingoTree:看不出你你的技术栈,想找什么工作,然后课设项目别写上去了,自我评价删了,前后端你想好你要干啥,这种简历投上去秒挂的
点赞 评论 收藏
分享
评论
12
1
分享

创作者周榜

更多
牛客网
牛客企业服务