经典回答
要讲清楚 Android 中的消息机制,肯定要先表述一下和 Handler 相关的一些类:
- Message:消息分为硬件产生的消息(如按钮、触摸)和软件生成的消息;
- MessageQueue:消息队列的主要功能向消息池投递消息(MessageQueue.enqueueMessage)和取走消息池的消息(MessageQueue.next);
- Handler:消息辅助类,主要功能向消息池发送各种消息事件(Handler.sendMessage)和处理相应消息事件(Handler.handleMessage);
- Looper:不断循环执行(Looper.loop),按分发机制将消息分发给目标处理者。
Handler 相关类的代码量并不大,建议大家都去看一下,网上也有很多介绍和分析这些源码的文章,大家自己 Google 一下。大家把代码过了一遍后,会更加深对整个过程的理解,讲起来就从容多了。
实际开发中注意的地方。比如会问在一个工作线程中创建自己的消息队例应该怎么做?
其实就是想从侧面验证他是否正的了解,是否知道要调用Looper.prepare(在每个线程只允许执行一次)。
或者再问问是否用过HandlerThread,它有什么优缺点等。
注意:Handler可能会引起的内存泄露
在Activity中像这样创建一个Handler再正常不过了。
private final Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {}};
但是,其实上面的代码可能导致内存泄露,当你使用Android lint工具的话,会得到这样的警告:
In Android, Handler classes should be static or leaks might occur,
Messages enqueued on the application thread’s MessageQueue also retain
their target Handler. If the Handler is an inner class, its outer
class will be retained as well. To avoid leaking the outer class,
declare the Handler as a static nested class with a WeakReference to
its outer class
有兴趣的可以细看一下这篇译文:《Android中Handler引起的内存泄露》
你的朋友是不是也在准备面试呢?你可以把今天的题目分享给好友,或许你可以帮到他。