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

3、首先判断当前 AsyncTask 状态,正在运行或者已经运行过就退出

4、调用 onPreExecute 执行准备工作

5、由 Executor 调用 FutureTask 的 run 方法,在 WorkerRunnable 中执行了 doInBackground

6、依旧是在 WorkerRunnable 中,调用 postResult,将执行结果通过 Handler 发送给主线程;调用 publishProgress 时,也是通过 Handler 将消息发送到主线程的消息队列中

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

[](()View 的工作机制源码分析

1、ViewGroup 首先根据自己的 MeasureSpec 和子 View 自己设定的宽高,来为每个子 View 生成 MeasureSpec

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 boolean 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,然后在当前线程通过拦截 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 器链条获取执行结果,最后对列中移除 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()方法时,通过反射拿到编译时生成的类,调用其构造方法完成目标类和绑定类的绑定
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值