速度优化
如果在测试环境,其实我们可以直接配置ip白名单,然后跳过DNS解析流程,直接获取ip地址 。比如:
private static class TestDNS implements Dns{@Overridepublic List<InetAddress> lookup(@NotNull String hostname) throws UnknownHostException {if ("www.test.com".equalsIgnoreCase(hostname)){InetAddress byAddress=InetAddress.getByAddress(hostname,new byte[]{(byte)192,(byte)168,1,1});return Collections.singletonList(byAddress);}else {return Dns.SYSTEM.lookup(hostname);}}}...................
19、Activity从创建到我们看到界面,发生了哪些事首先是通过setContentView加载布局,这其中创建了一个DecorView,然后根据然后根据activity设置的主题(theme)或者特征(Feature)加载不同的根布局文件,最后再通过inflate方法加载layoutResID资源文件,其实就是解析了xml文件,根据节点生成了View对象 。流程图:

文章插图
其次就是进行view绘制到界面上,这个过程发生在handleResumeActivity方法中,也就是触发onResume的方法 。在这里会创建一个ViewRootImpl对象,作为DecorView的parent然后对DecorView进行测量布局和绘制三大流程 。流程图:

文章插图
20、Activity、PhoneWindow、DecorView、ViewRootImpl 的关系?
- PhoneWindow是Window 的唯一子类,每个Activity都会创建一个PhoneWindow对象,你可以理解它为一个窗口,但不是真正的可视窗口,而是一个管理类,是Activity和整个View系统交互的接口,是Activity和View交互系统的中间层 。
- DecorView是PhoneWindow的一个内部类,是整个View层级的最顶层,一般包括标题栏和内容栏两部分,会根据不同的主题特性调整不同的布局 。它是在setContentView方法中被创建,具体点来说是在PhoneWindow的installDecor方法中被创建 。
- ViewRootImpl是DecorView的parent,用来控制View的各种事件,在handleResumeActivity方法中被创建 。
22、系统为什么提供Handler这点大家应该都知道一些,就是为了切换线程,主要就是为了解决在子线程无法访问UI的问题 。
那么为什么系统不允许在子线程中访问UI呢?
- 因为Android的UI控件不是线程安全的,所以采用单线程模型来处理UI操作,通过Handler切换UI访问的线程即可 。
- 因为加锁会让UI访问的逻辑变得复杂,而且会降低UI访问的效率,阻塞线程执行 。
- 大家应该都知道Looper是绑定到线程上的,他的作用域就是线程,而且不同线程具有不同的Looper,也就是要从不同的线程取出线程中的Looper对象,这里用到的就是ThreadLocal 。
所以需要一个管理Looper的类,但是,线程中并不止这一个要存储和获取的数据,还有可能有其他的需求,也是跟线程所绑定的 。所以,我们的系统就设计出了ThreadLocal这种工具类 。
ThreadLocal的工作流程是这样的:我们从不同的线程可以访问同一个ThreadLocal的get方法,然后ThreadLocal会从各自的线程中取出一个数组,然后再数组中通过ThreadLocal的索引找出对应的value值 。具体逻辑呢,我们还是看看代码,分别是ThreadLocal的get方法和set方法:
@Target(ElementType.METHOD)@Retention(RetentionPolicy.SOURCE)public @interface Override {}首先看看set方法,获取到当前线程,然后取出线程中的threadLocals变量,是一个ThreadLocalMap类,然后将当前的ThreadLocal作为key,要设置的值作为value存到这个map中 。get方法就同理了,还是获取到当前线程,然后取出线程中的ThreadLocalMap实例,然后从中取到当前ThreadLocal对应的值 。
其实可以看到,操作的对象都是线程中的ThreadLocalMap实例,也就是读写操作都只限制在线程内部,这也就是ThreadLocal故意设计的精妙之处了,他可以在不同的线程进行读写数据而且线程之间互不干扰 。
画个图方便理解记忆:

文章插图
当MessageQueue 没有消息的时候,在干什么,会占用CPU资源吗 。
- MessageQueue 没有消息时,便阻塞在 loop 的 queue.next() 方法这里 。具体就是会调用到nativePollOnce方法里,最终调用到epoll_wait()进行阻塞等待 。
推荐阅读
- 面试必问的 Redis:RDB、AOF、混合持久化
- 女人单身太久的十大负面表现
- |为什么说人在职场,尊严和面子都是争回来的,不是舔回来的
- 汽车|美国面临40年来最严重通胀 汽油、汽车、食品等统统暴涨:居民直呼疯狂
- 发型|女人50岁以后,放弃黑长直和泡面卷吧,这4种发型更减龄洋气
- 面霜|7款最受英国人喜欢的保湿面霜
- 翡翠|翡翠里面有气泡正常吗?这并不是注胶翡翠,而是另一种替代品
- QQ|成功瘦身!QQ 8.8.88安卓版发布:安装包缩小至625MB
- 吐血整理!这200道阿里P6必备Java面试题,我简直太爱了
- 显示器也走入全面屏时代 它为何更值得选择?
