Android应用出现ANR的原因和解决办法

出现场景

Android规定如果5秒钟之内无法响应屏幕触摸事件或者键盘输入事件就会出现ANR,BroadcastReceiver如果10秒也没执行完操作也会出现ANR。

如何定位

怎么定位问题?当一个进程发生了ANR了以后,系统会在/data/anr目录下创建一个文件traces.txt,通过分析这个文件就能定位出ANR的原因。
先导出traces文件,其中.表示当前目录:

//导出traces文件
 adb pull /data/anr/traces.txt .
//命令行查看文件
cat /data/anr/traces.txt | more

如何避免

基本的思路就是将IO操作在工作线程来处理,减少其他耗时操作和错误操作
采用异步的方式执行耗时操作。同时要注意子线程和主线程抢占同步锁的情况。

  • 使用AsyncTask处理耗时IO操作。
  • 使用Thread或者HandlerThread时,调用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)设置优先级,否则仍然会降低程序响应,因为默认Thread的优先级和主线程相同。
  • 使用Handler处理工作线程结果,而不是使用Thread.wait()或者Thread.sleep()来阻塞主线程。
  • Activity的onCreate和onResume回调中尽量避免耗时的代码。
  • BroadcastReceiver中onReceive代码也要尽量减少耗时,建议使用IntentService处理。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值