写点什么

Android ANR 和 OOM

作者:沃德
  • 2022 年 7 月 17 日
  • 本文字数:598 字

    阅读完需:约 2 分钟

ANR 出现

ANR 全称 (Application Not responding):指的是应用程序未响应,Android 系统对于事件的处理需要在一定时间内完成,如果超过该时间没有得到响应,就会造成 ANR。这时候会弹出一个弹窗来告诉用户,当前应用程序未响应,是选择等待还是Force Close


如果开发机器上出现问题,我们可以通过查看/data/anr/traces.txt 即可,最新的 ANR 信息在最开始部分。

  1. 主线程被 IO 操作(从 4.0 之后网络 IO 不允许在主线程中)阻塞。

  2. 主线程中存在耗时的计算

  3. 主线程中错误的操作,比如 Thread.wait 或者 Thread.sleep 等,Android 系统会监控程序的响应状况,一旦出现下面两种情况,则弹出 ANR 对话框

  4. 应用在 5 秒内未响应用户的输入事件(如按键或者触摸)

  5. BroadcastReceiver 未在 10 秒内完成相关的处理

  6. Service 在特定的时间内无法处理完成 20 秒

  7. 使用 AsyncTask 处理耗时 IO 操作。

  8. 使用 Thread 或者 HandlerThread 时,调用 Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)设置优先级,否则仍然会降低程序响应,因为默认 Thread 的优先级和主线程相同。

  9. 使用 Handler 处理工作线程结果,而不是使用 Thread.wait()或者 Thread.sleep()来阻塞主线程。

  10. Activity 的 onCreate 和 onResume 回调中尽量避免耗时的代码

  11. BroadcastReceiver 中 onReceive 代码也要尽量减少耗时,建议使用 IntentService 处理。

避免出现 OOM

  1. 使用更加轻量的数据结构

  2. Android 里面使用 Enum

  3. Bitmap 对象的内存占用

  4. 更大的图片

  5. onDraw 方法里面执行对象的创建

  6. StringBuilder

用户头像

沃德

关注

我就是个零 2018.06.14 加入

程序员而已

评论

发布
暂无评论
Android ANR和OOM_android_沃德_InfoQ写作社区