ANR

1.什么是ANR

Application Not Responding

如果我们的应用程序有一段时间点击不够灵敏,就会给我们弹出一个对话框 这个对话框的内容就是ANR
他就是可以让用户继续等待,让程序继续运行。而同时你也也可选择关闭
所以说对一个app良好的用户体验是极其重要的,是绝对不能出现ANR
因为这个对话框是十分影响用户体验的,在默认情况下一个Activity的执行时间是5s如果超过了5s没有做出响应,那就会出现这个ANR的对话框
在广播接收者当中最长的接受时间是10s,你可以在10s之内做出一些响应,如果超出10s还没有做出响应的话就会导致ANR。

那么到底产生ANR的原因是什么,以及他有那些后果,如何解 决呢?
ANR他就是应用程序未响应的一个对话框,
主要原因

  1. 应用程序的响应性是由Activity Manager和WindowManager系统服务监视的,当他检测到Activity 5s 10s 没有做出响应的时候就会给我们弹出ANR的对话框
  2. 在主线程中做了耗时操作,
    主线程中存在耗时的计算都会导致ANR的弹框。
    解决方案:将耗时操作用Handler来完成,子线程发送消息给主线程完成网络请求数据更新UI的操作。在Android中这就叫Handler机制。
    Android中哪些操作是在主线程呢?
    1.Activity的所有生命回调都是执行在主线程的。
    2.Service默认是执行在主线程的。(如果想要在Service里面进行耗时操作的话就可以使用Android中的另一个机制IntentService它里面可以做耗时操作)
    3.BroadcastReceiver的onReceive回调是执行在主线程的
    (在广播接收者里面也是不可做耗时操作的)
    4.没有使用子线程的looper的Handler的handleMessage,post(Runnable) 是执行在主线程的
    5.AsyncTask的回调除了DoInBackground,其他都是执行在主线程的

1.你无法响应用户的输入时间比如说在Activity或Service里面
2.在广播10s之内无法响应,都会弹出ANR对话框
造成以上两种情况的原因都是在主线程做了耗时操作
所以说为了避免ANR 我们要避免在主线程做耗时操作给用户良好的用户体验

如何解决ANR
1.你可以在Asynctask里面处理耗时IO操作
2.使用Thread或者HandlerThread提高优先级
HandlerThread可以在子线程当中可以创建Handler发送消息
因为它的内部创建了looper关联了一个消息队列,所以说它能创建Handler 而在子线程Thread里面是不可以创建Handler的
切记一定要提高优先级 不然他的优先级和主线程是一样的所以说它仍然会造成ANR
3.使用Handler来处理工作线程的耗时任务
4.在Activity的onCreate和onResume回调中尽量避免耗时的代码

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值