Android并发编程高级面试题汇总最全最细面试题讲解持续更新中👊👊
👀你想要的面试题这里都有👀
👇👇👇
invalidate() 和 postInvalicate() 区别
这道题想考察什么?
这道题想考察同学对这两种刷新的理解。
考生应该如何回答
二者的相同点
都是用来刷新界面。
二者的不同点
invalide是在UI线程中刷新View,要想在非UI线程中刷新View,就要用postInvalidate,因为postInvalidate底层是使用了Handler,同时postInvalidate可以指定一个延迟时间。
postInvalidate的调用流程:postInvalidate --> postInvalidateDelayed --> dispatchInvalidateDelayed --> mHandler.sendMessageDelayed --> 最后执行 Handler 的 MSG_INVALIDATE_RECT 消息,而这个消息里面实际上就是调用了 invalidate 方法。
Requestlayout,onlayout,onDraw,DrawChild区别与联系
这道题想考察什么?
考察同学对这几个方法背后的执行原理是否熟悉。
考生应该如何回答
讲解他们的工作流程,还有运行后的效果,从而对比他们的区别和联系
我们先来看View中的RequestLayout,看名字大家应该不难判断这个方法就是请求重新布局。
public void requestLayout() {
//清空测量缓存
if (mMeasureCache != null) mMeasureCache.clear();
...
//添加强制layout 标记,该标记触发layout
mPrivateFlags |= PFLAG_FORCE_LAYOUT;
//添加重绘标记
mPrivateFlags |= PFLAG_INVALIDATED;
if (mParent != null && !mParent.isLayoutRequested()) {
//如果上次的layout 请求已经完成
//父布局继续调用requestLayout
mParent.requestLayout();
}
...
}
不难看出,这个递归调用和题目7.10 中invalidate是采用了一样的配方,向上寻找其父布局,一直到ViewRootImpl为止,给每个布局设置PFLAG_FORCE_LAYOUT和PFLAG_INVALIDATED标记,注意这个是关键,所有的布局都在递归中被设置了标志位,然后最终会走到ViewRootImpl里面的requestLayout(),看下面的代码:
public void requestLayout() {
//是否正在进行layout过程
if (!mHandlingLayoutInLayoutRequest) {
//检查线程是否一致
checkThread();
//标记有一次layout的请求
mLayoutRequested = true;
//开启View 三大流程
scheduleTraversals();
}
}
所以,RequestLayout做的具体事情就是这样的:向上寻找父布局,找到后给他们标上强制layout和重绘的标签;然后 调用ViewRootImpl的 scheduleTraversals()开启三大绘制流程。
总结
RequestLayout()方法:会导致调用 onMeasure()方法和 onLayout(),将会根据标志位判断是否 需要 onDraw();
onLayout():摆放 viewGroup 里面的子控件,只有自定义ViewGroup需要重写;
onDraw():绘制视图本身(ViewGroup 还需要绘制里面的所有子控件);
drawChild(): 重新回调每一个子视图的 draw 方法 ,child.draw(canvas, this, drawingTime);
由于面试题内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要2023年Android中高级最全面试真题答案 完整文档的可扫描下方卡片免费获取~

PS:(文末还有使用ChatGPT机器人小福利哦!!大家不要错过)
目录

第一章 Java方面
- Java基础部分
- Java集合
- Java多线程
- Java虚拟机

第二章 Android方面
- Android四大组件相关
- Android异步任务和消息机制
- Android UI绘制相关
- Android性能调优相关
- Android中的IPC
- Android系统SDK相关
- 第三方框架分析
- 综合技术
- 数据结构方面
- 设计模式
- 计算机网络方面
- Kotlin方面

第三章 音视频开发高频面试题
- 为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?
- 怎么做到直播秒开优化?
- 直方图在图像处理里面最重要的作用是什么?
- 数字图像滤波有哪些方法?
- 图像可以提取的特征有哪些?
- 衡量图像重建好坏的标准有哪些?怎样计算?

第四章 Flutter高频面试题
- Dart部分
- Flutter部分

第五章 算法高频面试题
- 如何高效寻找素数
- 如何运用二分查找算法
- 如何高效解决雨水问题
- 如何去除有序数组的重复元素
- 如何高效进行模幂运算
- 如何寻找最长回文子串

第六章 Andrio Framework方面
- 系统启动流程面试题解析
- Binder面试题解析
- Handler面试题解析
- AMS面试题解析

文章详细解析了Android面试中的并发编程问题,包括invalidate()与postInvalidate()的区别,以及RequestLayout、onlayout、onDraw和DrawChild之间的关系。重点介绍了在UI更新中的线程处理和布局流程。
393

被折叠的 条评论
为什么被折叠?



