Android-Handler 相关问题总结

399 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

1.如何创建Message对象。
    Message对象可以通过new关键字创建,也可以通过obtain方法进行创建。google推荐
    使用obtain方式去创建。
    因为app中会有很多需要通过handler发送消息的场景,同时也会发送大量的message
    对象。为了避免频繁的创建和销毁对象而造成的性能问题,所以使用缓存池。
    
2.handler的请求发送到哪里去了。
    handler请求全部都发送到messageQueue中,并且被保存在单链表(Message)中。
3.handler的请求怎么处理
    在ActivityThread中,通过Looper.loop()方法不停中MessageQueue中获取到
    message对象,并调用Message对象中的target(handler)的dispatchMessage
    方法来处理。
4.MessageQueue怎么保证内部线程安全
    boolean enqueueMessage(Message msg, long when) {
    ....
    synchronized (this) {
        if (mQuitting) {
            IllegalStateException e = new IllegalStateException(
                    msg.target + " sending message to a Handler on a dead thread");
            Log.w(TAG, e.getMessage(), e);
            msg.recycle();
            return false;
        }
        ...
  }
5.MessageQueue有没有容量限制
    没有大小限制
6.为什么Looper死循环不会导致应用卡死
主要是采用epoll机制:

epoll大致的流程 image.png

7.子线程维护的Looper,在消息队列没有消息的时候该怎么处理?
    应该调用Looper的quit方法,可以将looper中的messageQueue都移除掉,并且将内存释放
8.MessageQueue优先级队列是如何排序的
    是依靠msg对象中提供的when参数,根据时间来进行排序
9.Message
   单链表结构:非线性,非顺序的物理结构,有n个节点组成
   链表采用‘见缝插针’的存储方式,不要求内存连续,靠next指针关联,存储的时候采用随机存储
   访问的时候是顺序访问