2020最全Android三方框架源码面试深度解析(GitHub标星4-6K+

2、ViewGroup 循环调用每个子 View 的 measure 方法,同时把子 View 的 MeasureSpec 传递过去

3、子 View 根据父视图给它的 MeasureSpec 确定最终的测量大小

可以看出,决定子 View 测量宽高的因素有:父视图的 MeasureSpec、子 View 自身指定的大小

[View 的工作机制源码分析完整版地址](()

[](()Android 触摸事件分发机制源码分析

[Android 触摸事件分发机制源码分析完整版地址](()

触摸事件分发流程:

1、ViewGroup 的事件分发

  • 首先判断自身是否需要,需要则进行拦截,并调用自身的 onTouchEvent 方法进行使用并决定是否消费,子 View 对事件无感。
  • 自己不需要则不进行拦截,事件分发给子 View(事件会分发给手指触摸区域的子 View,有重叠时传递给最上层 View)
  • 子 View 不消费时,事件会回传,调用自身的 onTouchEvent 方法进行使用并决定是否消费;子 View 消费时事件不回传

伪代码:

public boole 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 an dispatchTouchEvent(MotionEvent event) {
// 默认状态为未消费过
boolean result = false;
// 如果没有拦截
if (!onInterceptTouchEvent(event)) {
// 则交给子 view
result = child.dispatchTouchEvent(event);
}
// 如果事件没有被子 View 消费
if (!result) {
// 则询问自身 onTouchEvent()
result = onTouchEvent(event);
}
// 返回事件消费状态
return result;
}

2、View 的事件分发

dispatchTouchEvent 方法对 View 的监听器和方法进行分发,顺序如下:

onTouchListener – > onTouchEvent – > onLongClickListener – > onClickListener

[](()Android 按键事件分发机制源码分析

[Android 按键事件分发机制源码分析完整版地址](()

分发流程:

1、Activity 的分发

  • Activity 接收到事件,为 Menu 键直接消费掉。否则分发给 PhoneWindow,PhoneWindow 直接传递给它的 DecorView
  • DecorView 对 Back 键进行判断是否消费,不消费则分发给 ViewGroup
  • ViewGroup 不消费时,事件分发给 KeyEvent

2、ViewGroup 的分发

  • ViewGroup 有焦点且大小确定时,首先自己处理
  • ViewGroup 的子 View 有焦点且大小确定时,分发给子 View
  • 层层向下分发,直到最底层 View

3、View 的分发

View 首先将事件传递给 onKeyListner 监听器,不消费时传递给 KeyEvent

4、KeyEvent 的分发

KeyEvent 会根据类型来分别决定回调 Activity 或 View 的 onKeyDown、onKeyUp、onKeyLongPress 方法

5、事件回传

当 Activity、View 的 onKeyDown、onKeyUp 也没有消费事件时,事件会进行回传

[](()OkHttp 源码分析

示例:

mOkHttpClient.newCall(request).enqueue(callback);

[](()概述版

  • OkHttp 将请求信息封装在 Request 对象中,并创建一个 Call 对象
  • 调用 Call 对象的方法发起网络请求,采用责任链模式,将请求信息依次传递给每个拦截器,最终发起网络请求并返回结果

[](()分析版

1、OkHttpClient 的构建采用了 Builder 模式,Builder 模式易写易读且线程安全,适用于类的构造器有多个参数的情况

2、OkHttpClient 实现了 Call.Factory 接口(newCall 方法),通过 newCall 方法可以得到一个 RealCall 对象,可以操作 RealCall 对象执行请求、取消等一系列操作

3、RealCall 执行 execute 方法时,首先会在 client 的同步执行任务队列中记录当前 Call,然后在当前线程通过拦截器链条获取执行结果,最后对列中移除 Call

4、拦截器链条采用责任链模式,会依次执行每一个拦截器的 proceed 方法,直到最终的 CallServerInterceptor 完成网络请求

5、RealCall 的 enqueue 方法会直接将 Call 添加到 dispatcher 的异步执行队列,执行网络请求时也是通过拦截器链条完成

6、请求相关的所有信息封装在 Request 对象中,对于 Post 请求体 RequestBody 可以由 Byte 数组、ByteString、File、String 生成

[OkHttp 源码分析完整版地址](()

[](()Retrofit 源码分析

示例:

mRetrofit.create(RequestService.class).doGet(“params”).enqueue(callback);

[](()概述版

  • Retrofit 接口层实际是对 OkHttp 中 Request 的封装,采用注解的形式来描述网络请求参数
  • 采用动态代理模式创建请求接口对象,请求执行调用接口方法时,Retrofit 会根据注解创建相应的Call对象,接下来使用OkHttp发起请求

[](()分析版

1、首先需要使用注解的形式定义请求接口

2、然后通过建造者模式构造出 Retrofit 对象,Retrofit 对象的 create 方法采用动态代理模式,创建出请求接口的实例

3、发起请求时调用请求接口实例的相应方法,被调用处理器(InvocationHandler)拦截,最终返回一个 OkHttpCall 对象,OkHttpCall 有实现 Call 接口

4、接下来就是 OkHttp 的工作,调用 OkHttpCall 的 enqueue 或 execute 方法发起网络请求

[Retrofit 源码分析完整版地址](()

[](()ButterKnife 源码分析

[](()概述版

  • 写代码时对目标元素进行注解,编译时注解处理器会扫描注解,并通过 JavaPoet 自动生成 Java 文件
  • 调用 ButterKnife.bind()方法时,通过反射拿到编译时生成的类,调用其构造方法完成目标类和绑定类的绑定

[](()分析版

1、注解处理器 ButterKnifeProcessor 在编译时会扫描和处理所有注解,通过 JavaPoet 自动生成 .java 文件

2、调用 ButterKnife 的 bind 方法,通过反射拿到目标类类名,后面拼接_ViewBinding找到刚刚自动生成的 Java 类,并根据参数找到相匹配的构造器

3、调用 ViewBinding 类构造器的构造方法,将 ViewBinding 类和 目标类进行绑定

4、ViewBinding 类的构造方法中会对目标类的成员变量进行初始化及点击事件配置

[ButterKnife 源码分析完整版地址](()

学习福利

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值