这些关于 Handler 的知识点你都知道吗?

发布网友 发布时间:2024-10-17 06:44

我来回答

1个回答

热心网友 时间:4分钟前

在安卓面试中,关于Handler的问题是必考的,那么这些关于Handler的知识点你都知道吗?让我们逐一探索Handler的奥秘。



Handler的基本原理

关于Handler的原理,大家都应该有所了解,一张图就可以说明。



子线程中使用Handler

在子线程中使用Handler需要先执行两个操作:Looper.prepare和Looper.loop。为何需要这两个操作?因为Handler的构造函数会对Looper进行判断,如果ThreadLocal获取的Looper为空,就会报错。那么,Looper.prepare做了什么?它创建了Looper并设置给ThreadLocal,每个Thread只能有一个Looper,否则会抛出异常。而Looper.loop则是开始读取MessageQueue中的消息并执行。



MessageQueue如何等待消息

Looper.loop实际上就是开始读取MessageQueue中的消息。如果MessageQueue中没有消息,Looper会做什么?它会等待消息。那么,它是如何等待的呢?通过Looper.loop方法,我们知道是MessageQueue.next()来获取消息的,如果没有消息,会阻塞在这里。具体来说,MessageQueue.next调用了native方法nativePollOnce。



为什么不用wait而用epoll机制

在Android 2.2及以前,确实使用Java的wait/notify进行阻塞等待消息。但随着版本更新,改为使用epoll机制,主要原因是需要处理native侧的事件,仅使用Java的wait/notify不够。具体改动见commit记录。



线程与Handler、Looper、MessageQueue的关系

一个线程对应一个Looper,一个Looper对应一个MessageQueue,多个Handler共享一个MessageQueue。



多个线程给MessageQueue发消息的线程安全保证

保证线程安全的方式是为MessageQueue加锁。



Handler消息延迟处理

Handler处理延迟消息的机制在post一个延迟消息时,会将uptimeMillis和delayMillis相加作为when参数进行顺序排序。执行流程包括创建Message并设置参数,将其加入MessageQueue,等待执行。



View.post与Handler.post的区别

View.post与Handler.post本质上都通过Handler进行消息处理。区别在于View.post最终也是通过Handler.post执行,其执行过程包含在ViewRootImpl的实现中。



Handler引发的内存泄漏

内存泄漏问题与Handler息息相关,通常涉及内存管理与生命周期,如何排查与避免需要综合考虑。



非UI线程是否可以操作View

在非UI线程操作View时,确实存在。这主要是因为ViewRootImpl在主线程创建,检查创建线程与当前线程是否一致,因此非主线程无法直接操作UI。



本文总结了Handler相关的关键知识点,希望对你的学习和面试有所帮助。更多资源和面试题整理在GitHub上,欢迎查阅。

热心网友 时间:1分钟前

在安卓面试中,关于Handler的问题是必考的,那么这些关于Handler的知识点你都知道吗?让我们逐一探索Handler的奥秘。



Handler的基本原理

关于Handler的原理,大家都应该有所了解,一张图就可以说明。



子线程中使用Handler

在子线程中使用Handler需要先执行两个操作:Looper.prepare和Looper.loop。为何需要这两个操作?因为Handler的构造函数会对Looper进行判断,如果ThreadLocal获取的Looper为空,就会报错。那么,Looper.prepare做了什么?它创建了Looper并设置给ThreadLocal,每个Thread只能有一个Looper,否则会抛出异常。而Looper.loop则是开始读取MessageQueue中的消息并执行。



MessageQueue如何等待消息

Looper.loop实际上就是开始读取MessageQueue中的消息。如果MessageQueue中没有消息,Looper会做什么?它会等待消息。那么,它是如何等待的呢?通过Looper.loop方法,我们知道是MessageQueue.next()来获取消息的,如果没有消息,会阻塞在这里。具体来说,MessageQueue.next调用了native方法nativePollOnce。



为什么不用wait而用epoll机制

在Android 2.2及以前,确实使用Java的wait/notify进行阻塞等待消息。但随着版本更新,改为使用epoll机制,主要原因是需要处理native侧的事件,仅使用Java的wait/notify不够。具体改动见commit记录。



线程与Handler、Looper、MessageQueue的关系

一个线程对应一个Looper,一个Looper对应一个MessageQueue,多个Handler共享一个MessageQueue。



多个线程给MessageQueue发消息的线程安全保证

保证线程安全的方式是为MessageQueue加锁。



Handler消息延迟处理

Handler处理延迟消息的机制在post一个延迟消息时,会将uptimeMillis和delayMillis相加作为when参数进行顺序排序。执行流程包括创建Message并设置参数,将其加入MessageQueue,等待执行。



View.post与Handler.post的区别

View.post与Handler.post本质上都通过Handler进行消息处理。区别在于View.post最终也是通过Handler.post执行,其执行过程包含在ViewRootImpl的实现中。



Handler引发的内存泄漏

内存泄漏问题与Handler息息相关,通常涉及内存管理与生命周期,如何排查与避免需要综合考虑。



非UI线程是否可以操作View

在非UI线程操作View时,确实存在。这主要是因为ViewRootImpl在主线程创建,检查创建线程与当前线程是否一致,因此非主线程无法直接操作UI。



本文总结了Handler相关的关键知识点,希望对你的学习和面试有所帮助。更多资源和面试题整理在GitHub上,欢迎查阅。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com