面试题答案
一键面试一、Android 触摸响应延迟优化
- 底层原理:
- Android 系统的触摸事件处理流程是从底层驱动到 Framework 层再到应用层。触摸响应延迟可能是由于事件传递过程中的卡顿、主线程繁忙等原因。在 Android 系统中,主线程负责处理 UI 绘制和用户交互事件,如果主线程被大量耗时操作占用,触摸事件处理就会受到影响。
- 代码层面调整:
- 优化主线程:
- 将耗时操作放到子线程执行,例如使用
AsyncTask
、HandlerThread
或ExecutorService
。比如,如果应用在触摸事件处理时需要进行网络请求或数据库查询,应将这些操作放到子线程。以AsyncTask
为例:
- 将耗时操作放到子线程执行,例如使用
- 优化主线程:
private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
// 耗时操作,如网络请求或数据库查询
return null;
}
@Override
protected void onPostExecute(Void result) {
// 更新 UI
}
}
- 优化布局:
- 减少布局层级,复杂的嵌套布局会增加测量和布局计算的时间。使用
ConstraintLayout
代替多层嵌套的LinearLayout
或RelativeLayout
。例如,原本多层嵌套的布局:
- 减少布局层级,复杂的嵌套布局会增加测量和布局计算的时间。使用
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<!-- 子视图 -->
</LinearLayout>
<!-- 更多嵌套 -->
</LinearLayout>
可以优化为 ConstraintLayout
:
<ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 设置约束关系 -->
</ConstraintLayout>
- 硬件加速:
- 确保应用开启硬件加速。在
AndroidManifest.xml
中,给<application>
标签添加android:hardwareAccelerated="true"
。硬件加速可以利用 GPU 进行图形渲染,提高 UI 绘制效率,从而加快触摸响应。
- 确保应用开启硬件加速。在
二、iOS 反馈过渡效果不流畅优化
- 底层原理:
- iOS 的图形渲染和动画处理依赖于 Core Animation 框架。过渡效果不流畅可能是由于动画计算复杂、帧率不稳定等。Core Animation 在主线程上运行,如果主线程负载过高,就会影响动画的流畅性。同时,图层合成也可能成为性能瓶颈,如果图层过多或者合成方式不合理,会导致渲染效率降低。
- 代码层面调整:
- 优化主线程:
- 避免在主线程进行大量计算。如果有复杂的计算任务,使用
DispatchQueue
将其放到后台队列执行。例如:
- 避免在主线程进行大量计算。如果有复杂的计算任务,使用
- 优化主线程:
DispatchQueue.global(qos:.background).async {
// 复杂计算
DispatchQueue.main.async {
// 更新 UI
}
}
- 优化动画:
- 使用
CADisplayLink
来精确控制动画帧率。CADisplayLink
会在屏幕每次刷新时调用指定的方法,确保动画平滑。示例代码:
- 使用
let displayLink = CADisplayLink(target: self, selector: #selector(updateAnimation))
displayLink.add(to:.main, forMode:.common)
@objc func updateAnimation() {
// 动画更新逻辑
}
- 图层优化:
- 减少不必要的图层,避免过多的图层合成。如果视图不需要透明效果,将
opaque
属性设置为true
,这样可以提高渲染效率。例如:
- 减少不必要的图层,避免过多的图层合成。如果视图不需要透明效果,将
let myView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
myView.opaque = true
同时,对于复杂的视图,可以使用 CALayer
的 shouldRasterize
属性进行光栅化,将图层缓存为位图,减少重复渲染,但要注意合理设置 rasterizationScale
以避免模糊。
let layer = CALayer()
layer.shouldRasterize = true
layer.rasterizationScale = UIScreen.main.scale