Android ANR 和 OOM
ANR 出现
ANR
全称 (Application Not responding)
:指的是应用程序未响应,Android
系统对于事件的处理需要在一定时间内完成,如果超过该时间没有得到响应,就会造成 ANR。这时候会弹出一个弹窗来告诉用户,当前应用程序未响应,是选择等待还是Force Close
。
如果开发机器上出现问题,我们可以通过查看/data/anr/traces.txt 即可,最新的 ANR 信息在最开始部分。
主线程被 IO 操作(从 4.0 之后网络 IO 不允许在主线程中)阻塞。
主线程中存在耗时的计算
主线程中错误的操作,比如 Thread.wait 或者 Thread.sleep 等,Android 系统会监控程序的响应状况,一旦出现下面两种情况,则弹出 ANR 对话框
应用在 5 秒内未响应用户的输入事件(如按键或者触摸)
BroadcastReceiver 未在 10 秒内完成相关的处理
Service 在特定的时间内无法处理完成 20 秒
使用 AsyncTask 处理耗时 IO 操作。
使用 Thread 或者 HandlerThread 时,调用 Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)设置优先级,否则仍然会降低程序响应,因为默认 Thread 的优先级和主线程相同。
使用 Handler 处理工作线程结果,而不是使用 Thread.wait()或者 Thread.sleep()来阻塞主线程。
Activity 的 onCreate 和 onResume 回调中尽量避免耗时的代码
BroadcastReceiver 中 onReceive 代码也要尽量减少耗时,建议使用 IntentService 处理。
避免出现 OOM
使用更加轻量的数据结构
Android 里面使用 Enum
Bitmap 对象的内存占用
更大的图片
onDraw 方法里面执行对象的创建
StringBuilder
评论