Handler源码阅读随笔

时间:2025-02-08 10:34:19
Handler源码阅读随笔

的创建

在App启动的时候,在ActivityThread的main方法里,会为主线程会调用方法,该方法会在TLS里创建并保存一个Loop对象,而在创建Loop对象时,会在Loop的构造方法里创建一个MessageQueue,最后会调用方法来开启循环。

是如何保证线程唯一的

在Loop的paper方法中创建Loop对象时,会将创建的对象保存在ThreadLocal中,ThreadLocal内部是一个HashMap的结构,Loop在每次创建的时候都会去TLS里获取是否已经创建。

的唤醒机制

Handler的底层实现是管道的方式,利用IO的多路复用机制,如epoll等,当MessageQueue里没有要处理的消息,且也没有空闲消息处理,此时的Loop会进入阻塞状态。当在Java层创建一个MessageQueue时,在Native层也会创建一个NativeMessageQueue,同时NativeMessageQueue会创建一个NativeLoop。并创建一个管道,同时将管道的读端文件描述符和写端文件描述符保证在Loop的成员变量中,当执行Java层的enqueueMessage方法后需要唤醒Loop循环时,会直接在管道中的写端文件描述符中写入一个字符“W”,当读端文件描述符监听到时就会唤醒Loop循环。

的同步屏障机制

当target为null时,此Message不会被处理,但是loop循环会忽略接下来的所有同步Message,直到遇到一个异步Message。多用于View的视图刷新,以此来保证过多的Message不会影响到View的刷新。