不知庐山真面目只缘身在此山中,讲解一下Handler

发布时间:2020-03-01 23:08:28 作者:Android丶VG
来源:网络 阅读:313

o(╥﹏╥)o今天太困了,啥也不想干。就把之前收集的资料拿出来温习一下刚好和大家共享下

不知庐山真面目只缘身在此山中,讲解一下Handler

之前在" rel="nofollow">GitHub
上更新了些关于面试类的文章,含有从基础到进阶。含有BATJ.字节跳动面试专题,算法专题,高端技术专题,混合开发专题,java面试专题,Android,Java小知识,到性能优化.线程.View.OpenCV.NDK等应有尽有。还有辅之相关的视频+学习笔记

(更多完整项目下载。未完待续。源码。图文知识后续上传github。)
可以点击关于我联系我获取完整PDF
(VX:mm14525201314)

Handler

1、谈谈消息机制 Handler 作用 ?

负责跨线程通信,这是因为在主线程不能做耗时操作,而子线程不能更新 UI,所以当子线程中进行耗时操作后需要更新 UI时,通过 Handler 将有关 UI 的操作切换到主线程中执行。

具体分为四大要素:

具体流程如下:
不知庐山真面目只缘身在此山中,讲解一下Handler

2、一个线程能否创建多个 Handler,Handler 跟 Looper 之间的对应关系 ?
3、软引用跟弱引用的区别
4、Handler 引起的内存泄露原因以及最佳解决方案

为什么会导致泄露:
Handler 允许我们发送延时消息,如果在延时期间用户
关闭了 Activity,那么该 Activity 会泄露。 这个泄露
是因为 Message 会持有 Handler,而又因为 Java 的
特性,内部类会持有外部类,使得 Activity 会被
Handler 持有,这样最终就导致 Activity 泄露。

怎么解决:
将 Handler 定义成静态的内部类,在内部持有
Activity 的弱引用,并在 AcitivityonDestroy()
调用 handler.removeCallbacksAndMessages(null)
及时移除所有消息。

5、为什么系统不建议在子线程访问 UI?

Android 的 UI 控件不是线程安全的,如果在多线程中并发访问
可能会导致 UI 控件处于不可预期的状态

这时你可能会问为何系统不对 UI 控件的访问加上锁机制呢?因为:

7、使用 Handler 的 postDealy 后消息队列会有什么变化?

如果队列中只有这个消息,那么消息不会被发送,而是计算到
时唤醒的时间,先将 Looper 阻塞,到时间就唤醒它。但如果此时要加入新消息,该消息队列的对头跟 delay 时间相比更长,
则插入到头部,按照触发时间进行排序,队头的时间最小、队
尾的时间最大

8丶子线程直接 new 一个 Handler 吗?怎么做?

不可以,因为在主线程中,Activity 内部包含一个 Looper 对
象,它会自动管理 Looper,处理子线程中发送过来的消息。而
对于子线程而言,没有任何对象帮助我们维护 Looper 对象,所以需要我们自己手动维护。所以要在子线程开启 Handler 要先
创建 Looper,并开启 Looper 循环

9、Message 可以如何创建?哪种效果更好,为什么?

可以通过三种方法创建:

后两者效果更好,因为 Android 默认的消息池中消息数量是 10,而后
两者是直接在消息池中取出一个 Message 实例,这样做就可以避免多
生成 Message 实例。

请查看完整的PDF版
(更多完整项目下载。未完待续。源码。图文知识后续上传github。)
可以点击关于我联系我获取完整PDF
(VX:mm14525201314)

不知庐山真面目只缘身在此山中,讲解一下Handler

推荐阅读:
  1. 带你手把手重读 Handler 源码,聊聊那些你所不知道一二
  2. Handler原理是什么

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

android bat handler

上一篇:服务器性能测试

下一篇:mongodb分片概念和原理-实战分片集群

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》