Android面试题:Handler

Android面试题:Handler1 一个线程有几个 Handler 答 一个线程可以有多个 Handler 2 一个线程有几个 Looper 如何保证 答 一个线程只能有 1 个 Looper Looper 对象通过 ThreadLocalM 保存 ThreadLocalM 保存键值对 该键值对的键为 ThreadLocal 对象 一旦 ThreadLocalM 中已经存在 Looper 对象 再次创建 Looper 对象会抛出异常 3 Handler 内存泄漏原因 为什么其他内部类没有这个问题 答 非静态内部类或者匿名内部类 默认持有

1.一个线程有几个Handler?

答:一个线程可以有多个Handler。

2.一个线程有几个Looper?如何保证?

答:一个线程只能有1个Looper。Looper对象通过ThreadLocalMap保存,ThreadLocalMap保存键值对,该键值对的键为ThreadLocal对象,一旦ThreadLocalMap中已经存在Looper对象,再次创建Looper对象会抛出异常。

3.Handler内存泄漏原因?为什么其他内部类没有这个问题?

答:非静态内部类或者匿名内部类,默认持有外部类的引用。当内部类的生命周期比外部类长时,就会导致内存泄漏。Handler在Activity中作为内部类使用时,handler持有activity的引用。当activity生命周期结束,仍有message没有处理完时,就会导致activity无法被回收,造成内存泄漏。

解决方法:

1. 自定义静态Handler,需要调用activity时,弱引用activity。

2. 在activity的onDestroy()方法中调用handler.removeCallbackAndMessage()方法清空消息队列。

4.为什么主线程可以new Handler?如果要在子线程中new Handler要做什么准备?

5.子线程中维护的Looper,消息队列无消息的时候的处理方案是什么?有什么用?

答:子线程中Looper.loop()会使Looper一直处于阻塞状态,等待消息的处理。无消息的时候需要调用Looper的quit()方法来结束循环,释放线程。因此在子线程中使用Handler,需要有3个操作:

1. prepare() 创建looper

2. loop() 循环队列

3. quit() 结束循环

6.既然可以存在多个Handler往MessageQueue中添加数据(发消息时各个Handler可能处于不同线程),那它内部是如何确保线程安全的?

答:在MessageQueue入队列的方法和取消息的方法中都加了synchronized锁,从而保证了线程安全。

7.我们使用Message时应该如何创建它?

在实际开发中不建议直接使用new Message。因为在Message内部保存了一个缓存消息池,我们可以用obtain方法从缓存池获取消息,这样能有效避免重复创建Message而造成的内存问题。

8.使用Handler的postDelay后消息队列会有什么变化?

答:MessageQueue里的消息会以时间顺序(执行的先后顺序)来排序,使用Handler的postDealy后,MessageQueue里的消息会进行重新排序。postDealy发送的消息会根据延迟时间与消息队列里存在的消息的执行时间进行比较,然后寻找插入位置插入消息。

9. 为什么主线程的Looper死循环不会导致应用卡死?

答:ActivityThread的main方法主要就是做消息循环,一旦退出消息循环,那么你的应用也就退出了,Looer.loop()方法可能会引起主线程的阻塞,但只要它的消息循环没有被阻塞,能一直处理事件就不会产生ANR异常。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/174082.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月27日 上午7:14
下一篇 2026年3月27日 上午7:15


相关推荐

  • mysql数据库的实例_MySQL数据库实例-解释汇总

    mysql数据库的实例_MySQL数据库实例-解释汇总1 mysql 体系结构由数据库和数据库实例组成 是单进程多线程架构 数据库 物理操作系统文件或者其他文件的集合 在 mysql 中 数据库文件可以是 frm myd myi ibd 等结尾的文件 当使用 ndb 存储引擎的时候 不是 os 文件 是存放于内存中的文件 数据库实例 由数据库后台进程 线程以及一个共享内存区组成 共享内存可以被运行的后台线程 进程所共享 2 实例所谓多实例 就是在一台服务器上搭建 运行多

    2026年3月26日
    1
  • tomcat日志配置——如何查看日志

    tomcat日志配置——如何查看日志Tomcat日志设定1、Tomcat日志概述Tomcat日志信息分为两类:一、是运行中的日志,它主要记录运行的一些信息,尤其是一些异常错误日志信息。二、是访问日志信息,它记录的访问的时间,IP,访问的资料等相关信息。2Tomcat日志配置2.1访问日志的配置默认tomcat不记录访问日志,如下方法可以使tomc…

    2022年6月20日
    81
  • 线性代数笔记9——消元矩阵与置换矩阵

    线性代数笔记9——消元矩阵与置换矩阵消元矩阵 如果用矩阵表示一个有解的方程组 那么矩阵经过消元后 最终能变成一个上三角矩阵 U 用一个三元一次方程组举例 A 经过一些列变换 最终得到了一个上三角矩阵 U nbsp 回代到方程组后可以直接求解 nbsp 如果上面的变换去掉增广矩阵 可以简写为 矩阵的初等变换可以用矩阵乘法实现 现在的问题是 我们能否得到一个可以表示整个消元过程的矩阵 E 使得 E 与 A 相乘能够

    2026年3月18日
    2
  • rider 激活码[最新免费获取]

    (rider 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月26日
    348
  • 树莓派 Node Red

    树莓派 Node RedNode RED 目标 在树莓派上 零编程 快速搭建一个 MQTTclient 简介官网 https nodered org 简介 基于浏览器的流编辑 Node RED 提供了一个基于浏览器的流编辑器 可以使用调色板中广泛的节点轻松地将流连接到一起 然后 只需单击一次 就可以将流部署到运行时 可以使用文本编辑器在编辑器中创建 JavaScript 函数 内置库允许您保存有用的函数 模板或流以供重用 构建在 Node js 之上构建在 Node js 上的轻量级 运行 充分利用了它的事件驱动 非阻

    2026年3月16日
    2
  • J2EE开发推荐工具

    J2EE开发推荐工具

    2026年3月19日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号