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要做什么准备?

答:不能在没有调用Looper.prepare()方法的线程中创建Handler。因为在Handler的构造函数中如果mLooper 对象为空就会抛出异常,只有调用了 Looper.prepare() 方法,才会构造一个 Looper 对象并存储在 ThreadLocal 当中。
主线程中默认已经执行了Looper.prepare()方法,因此可以直接在主线程中new Handler()。在子线程中则需要我们自己先调用Looper.prepare(),然后再去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时应该如何创建它?

答:创建Message对象有三种方法:
1. Message message = new message();
2. Message message = Message.obtain();
3. Message message = handler.obtainMessage();

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

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

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

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

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

Android面试题:Handler相关推荐

  1. Android 基本面试题

    Android 基本面试题 一.java 核心思想 1.八种基本数据类型和封装类 基本类型 大小(字节) byte 1 short 2 int 4 long 8 float 4 double 8 bo ...

  2. 【Android面试】Android面试题集锦 (陆续更新)(最新2012-6-18)

    1.android开发新浪面试题[开发者必看哦] 下载地址 http://www.eoeandroid.com/thread-177885-1-1.html 2.华为关于android笔试题案例解析 ...

  3. android面试题总结加强

    在加强版的基础上又再加强的android应用面试题集 有些补充略显臃肿,只为学习 1.activity的生命周期. 方法 描述 可被杀死 下一个 onCreate() 在activity第一次被创建的 ...

  4. 【Android面试】Android面试题集锦 (陆续更新)

    [Android面试]Android面试题集锦 (陆续更新) 分类: [杂七杂八]2011-05-11 17:58 2064人阅读 评论(0) 收藏 举报 一些常见的Android面试基础题做下总结, ...

  5. Android之面试题总结加强版(一)

    转载:http://blog.csdn.net/itachi85/article/details/7426451 自己总结的最强android应用面试题集 1.activity的生命周期. 方法 描述 ...

  6. 安卓Android面试题大全

    56个问题都是经常用到的,可以深入研究下,也是必须掌握的开发必备知识. 安卓Android面试题汇总 搜集了一些Android面试题目,供将要面试或者正在面试的朋友参考. 1, 谈谈你对Activit ...

  7. 金三银四的面试黄金季节,Android面试题来了!

    金三银四的跳槽季节,你准摆好了吗? 首先我们分享一个Android知识图谱. 下面是一些面试官基本必问的问题,请一定要去了解! 基础知识 – 四大组件(生命周期,使用场景,如何启动) java基础 – ...

  8. 2020年度整理国内一线互联网公司内部Android面试题库

    一眨眼又到年底了,每到这个时候,我们都会慢慢反思,这一年都做了什么?有什么进步?年初的计划都实现了吗?明年年初有跳槽的底气了吗? 况且2020年我们经历了新冠疫情的洗礼,很多程序员都经历了失业,找工作 ...

  9. Android面试题收集(有具体答案)

    Android面试题目及其答案 1.Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 DVM指dalivk的虚拟机.每个Android应用程序都在它自己的进程中执行,都 ...

  10. Android 面试题合集 - 收藏集 - 掘金

    面试时,你被问到过 TCP/IP 协议吗? - 掘金 前言: 精通 TCP/IP,熟练使用 Socket 进行网路编程. 看到这句话,有没有感到很熟悉呀?相信很多人在投递简历的时候都看到过这条要求,很 ...

最新文章

  1. 【书评:Oracle查询优化改写】第14章 结尾章
  2. Unieap3.5错误收集
  3. vue中如何进行Excel文件的下载
  4. 【MyBatis学习05】SqlMapConfig.xml文件中的配置总结
  5. 非递归二叉树的序列打印
  6. 分享!手机浏览器一键跳转微信加好友的方法
  7. 多向思考者--高敏感人群的内心世界
  8. QtCreator一键重命名
  9. 机器学习系列-- 异常检测(Anomaly Detection)
  10. Unable to get offset lags for kafka. Reason: java.lang.NullPointerException at org.apache.storm.kafk
  11. 在dropdown item中设置退出登录
  12. 常用的图像特征提取方法
  13. PDF图片文字如何编辑?ORC图文识别一招搞定
  14. Latex写文章时插入单栏图片和双栏图片方法
  15. can和could的用法_could的用法
  16. win系统修改C盘下user/用户名
  17. InfiniteScroll 无限滚动组件的使用
  18. 关于智能化弱电工程实施的几个重要问题
  19. oracle数据泵导出文件权限,oracle数据泵导出
  20. 【Wayland】初识Wayland(X、Mir)

热门文章

  1. Matlab 图像去雾
  2. day1 机器学习基础
  3. 苏宁易购选举任峻为董事长并任总裁:侯恩龙与陆耀为副总裁
  4. 【游戏开发】关于Direct X(六)绘制蝙蝠着色器
  5. 郑州市元宇宙产业发展实施方案发布,中创助力元宇宙创新建设!
  6. [floyed][叉积][距离公式](JZOJ)泽泽在巴西
  7. 教师精彩课堂用语50句
  8. chatgpt4开放申请啦
  9. 星星之火-16:在公共的空口信道中,GSM如何避免不同的基站之间相互干扰?
  10. 魔众企业官网系统 v4.5.0 后台菜单快捷搜索,组件显示优化