Android高级UI面试题汇总(含详细解析 八)

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

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机器人小福利哦!!大家不要错过)

目录

img

第一章 Java方面

  • Java基础部分
  • Java集合
  • Java多线程
  • Java虚拟机

img

第二章 Android方面

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

img

第三章 音视频开发高频面试题

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

img

第四章 Flutter高频面试题

  • Dart部分
  • Flutter部分

img

第五章 算法高频面试题

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

img

第六章 Andrio Framework方面

  • 系统启动流程面试题解析
  • Binder面试题解析
  • Handler面试题解析
  • AMS面试题解析

img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值