概述
1.什么是ANR
Application Not Responding
如果我们的应用程序有一段时间点击不够灵敏,就会给我们弹出一个对话框 这个对话框的内容就是ANR
他就是可以让用户继续等待,让程序继续运行。而同时你也也可选择关闭
所以说对一个app良好的用户体验是极其重要的,是绝对不能出现ANR
因为这个对话框是十分影响用户体验的,在默认情况下一个Activity的执行时间是5s如果超过了5s没有做出响应,那就会出现这个ANR的对话框
在广播接收者当中最长的接受时间是10s,你可以在10s之内做出一些响应,如果超出10s还没有做出响应的话就会导致ANR。
那么到底产生ANR的原因是什么,以及他有那些后果,如何解 决呢?
ANR他就是应用程序未响应的一个对话框,
主要原因
- 应用程序的响应性是由Activity Manager和WindowManager系统服务监视的,当他检测到Activity 5s 10s 没有做出响应的时候就会给我们弹出ANR的对话框
- 在主线程中做了耗时操作,
主线程中存在耗时的计算都会导致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回调中尽量避免耗时的代码
最后
以上就是自觉宝马为你收集整理的ANR的全部内容,希望文章能够帮你解决ANR所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复