本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
ANR出现的场景以及解决方案
mylove136 · 577浏览 · 发布于2019-07-23 +关注

ANR: application not response,应用程序没有响应。Android应用程序基于消息处理机制保证在发生输入、触摸等需要响应的事件之后,在规定的时间内没有得到有效的响应或者响应时间过长,都会发生ANR,弹出ANR对话框---等待应用或者退出应用。


Android中的响应性事件处理受到Activity Manager Service、Window Manager Service这两个系统服务的监视,所有与ANR相关的消息,都经过系统进程(system_service)的调度,然后分发给应用进程进行实际的消息处理。系统进程通过系统服务的监视,根据不同的情况限制不同的超时时长,一旦在限制的时间内得不到响应,就会调用AppNotRespondingDialog.show()显示ANR对话框。


实际上,Android的主线程,也就是用来绘制View的UI线程,是线程不安全的,所以就使用ANR原则对主线程进行限制,保证主线程在串行处理事件时保持流畅性,给用户良好的体验(比如UI的绘制工作必须在16ms内完成)。所以在主线程中的所有耗时操作(密集型cup操作、网络请求、大量IO等),都有可能发生ANR。


Android四大组件Activity、Service、BroadcastReceiver、ContentProvider都是运行在主线程中,对此定义不同的标准限制它们的响应时长:

  • Service TimeOut:Service:前台Service(通知栏有显示)20s内、后台Service200s内

  • BroadcastQueue TimeOut:BroadcastReceiver中,前台广播10s,后台广播60s。

  • ContentProvider TimeOut:在publish中超过10s

  • InputDispatching TimeOut:键盘输入事件、触摸事件5s内得不到响应


ANR监测机制: 整体的一个大致流程就是---事件开始前进行计时->进行事件处理->事件处理完,限制时间没到,移除计时,系统正常进行。事件没处理完,限制时间已到,移除计时,弹出ANR对话框

发生事件处理超时的情况有两种:

  • 当前事件没有机会得到处理,主线程正在响应另外的时间,当前事件被阻塞

  • 当前事件正在处理,但处理事件过长导致长时间得不到响应


ANR预防: 耗时操作在尽量子线程中操作---AsyncTask、intentService、HandlerThread,多线程操作避免死锁的出现以及快速的解决办法,还有就是UI层次的复杂绘制,尽量减少布局嵌套,如果Activity初始化需要一定的耗时,可以考虑马上显示Activity显示Dialog加载框异步加载数据。


相关推荐

android下vulkan与opengles纹理互通

talkchan · 1174浏览 · 2020-11-23 10:37:39
Android 使用RecyclerView实现轮播图

奔跑的男人 · 2173浏览 · 2019-05-09 17:11:13
微软发布新命令行工具 Windows Terminal

吴振华 · 867浏览 · 2019-05-09 17:15:04
Facebook 停止屏蔽部分区块链广告

· 753浏览 · 2019-05-09 17:20:08
加载中

0评论

评论
分类专栏
小鸟云服务器
扫码进入手机网页