移动端测试面试题, 测试 APP 时出现 ANR应用无响应,可能是什么原因导致?
移动端测试面试题, 测试 APP 时出现 ANR应用无响应,可能是什么原因导致?
QA
Step 1
Q:: 测试 APP 时出现 ANR(应用无响应),可能是什么原因导致?
A:: ANR(Application Not Responding)是指应用程序长时间未响应用户输入,导致系统弹出提示的现象。导致 ANR 的原因主要包括以下几个方面:
1. **主线程阻塞**:主线程被长时间的操作(如复杂计算、网络请求、文件I/
O)阻塞,导致无法及时响应用户操作。
2.
后台服务阻塞:某些后台服务在处理任务时耗时过长,影响主线程的调度。
3.
死锁:线程间发生死锁,导致某些线程无法继续执行,最终造成主线程阻塞。
4.
广播接收器(BroadcastReceiver)耗时过长:广播接收器执行时间过长,会导致系统等待,进而触发 ANR。
5.
ContentProvider 查询操作耗时:ContentProvider 执行查询操作时如果耗时过长,也可能导致 ANR。
Step 2
Q:: 如何避免或减少 ANR 的发生?
A:: 避免或减少 ANR 的发生可以采取以下几种方法:
1.
在子线程中处理耗时操作:将网络请求、数据库操作、大量数据处理等操作放在子线程中执行,避免主线程被阻塞。
2.
使用异步机制:采用异步任务(如 AsyncTask)或回调机制来处理耗时操作,并将结果传回主线程更新 UI。
3.
合理使用 Handler:通过 Handler 在子线程中发送消息,并在主线程中处理消息,从而避免主线程的阻塞。
4.
优化广播接收器:在广播接收器中只执行快速的操作,必要时将复杂操作放在 IntentService 中执行。
5.
监控和调优:使用工具(如 Android Studio Profiler)监控应用的性能,并针对性能瓶颈进行优化。
Step 3
Q:: ANR 的触发条件是什么?
A:: Android 系统会在以下几种情况下触发 ANR:
1. **主线程(UI 线程)在 5
秒内没有响应用户输入事件(如点击或触摸)。**
2. **BroadcastReceiver 在 10
秒内没有处理完成。**
3. **Service 的前台服务请求在 20
秒内没有处理完成。**