说说Android中的ANR
2016-05-18 20:35
323 查看
有过Android开发经历的人都不会对ANR陌生,它和崩溃一样是程序设计的问题。本文将以较为深入的视角来介绍什么是ANR,出现场景,如何避免以及如何定位分析ANR,希望可以帮助大家在编写程序时有所帮助。
Android系统会监控程序的响应状况,一旦出现下面两种情况,则弹出ANR对话框
使用AsyncTask处理耗时IO操作。
使用Thread或者HandlerThread时,调用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)设置优先级,否则仍然会降低程序响应,因为默认Thread的优先级和主线程相同。
使用Handler处理工作线程结果,而不是使用Thread.wait()或者Thread.sleep()来阻塞主线程。
Activity的onCreate和onResume回调中尽量避免耗时的代码
BroadcastReceiver中onReceive代码也要尽量减少耗时,建议使用IntentService处理。
如果程序正在后台处理用户的输入,建议使用让用户得知进度,比如使用ProgressBar控件。
程序启动时可以选择加上欢迎界面,避免让用户察觉卡顿。
使用Systrace和TraceView找出影响响应的问题。
什么是ANR
ANR全称Application Not Responding,意思就是程序未响应。如果一个应用无法响应用户的输入,系统就会弹出一个ANR对话框,如下图所示,用户可以自行选择继续等待亦或者是停止当前程序。出现场景
主线程被IO操作(从4.0之后网络IO不允许在主线程中)阻塞。 主线程中存在耗时的计算 主线程中错误的操作,比如Thread.wait或者Thread.sleep等
Android系统会监控程序的响应状况,一旦出现下面两种情况,则弹出ANR对话框
应用在5秒内未响应用户的输入事件(如按键或者触摸) BroadcastReceiver未在10秒内完成相关的处理
如何避免
基本的思路就是将IO操作在工作线程来处理,减少其他耗时操作和错误操作使用AsyncTask处理耗时IO操作。
使用Thread或者HandlerThread时,调用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)设置优先级,否则仍然会降低程序响应,因为默认Thread的优先级和主线程相同。
使用Handler处理工作线程结果,而不是使用Thread.wait()或者Thread.sleep()来阻塞主线程。
Activity的onCreate和onResume回调中尽量避免耗时的代码
BroadcastReceiver中onReceive代码也要尽量减少耗时,建议使用IntentService处理。
画龙点睛
通常100到200毫秒就会让人察觉程序反应慢,为了更加提升响应,可以使用下面的几种方法如果程序正在后台处理用户的输入,建议使用让用户得知进度,比如使用ProgressBar控件。
程序启动时可以选择加上欢迎界面,避免让用户察觉卡顿。
使用Systrace和TraceView找出影响响应的问题。
如何定位
如果开发机器上出现问题,我们可以通过查看/data/anr/traces.txt即可,最新的ANR信息在最开始部分。我们从stacktrace中即可找到出问题的具体行数。相关文章推荐
- Android Menu
- Android项目开发时常用到的工具类编写
- Android中的文本框,图片以及点击事件的设置
- Android搜索框之PopupWindow+ListView实现
- android-studio使用真机调试
- android6.0 sm进程(获取MountService信息)
- Android 虚拟机中与PC键盘对应的按键 --14
- Android Fragment 真正的完全解析(下)
- Android的5种布局
- Android之SharedPreferences两个工具类
- Android中的电话通讯机制
- Android广告轮播图添加标题及点击事件
- Android:我遇到的OOM以及解决方法
- Android Fragment 真正的完全解析(上)
- 自定义baseAdapter的比较好的一种方法
- Android实现支持缩放平移图片
- Android中的电话通讯机制(1)
- android 代码控制隐藏
- 组合组件のCusRelativeLayout(Android-自定义相对布局)
- android中bitmap