我是靠谱客的博主 自觉宝马,最近开发中收集的这篇文章主要介绍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回调中尽量避免耗时的代码

最后

以上就是自觉宝马为你收集整理的ANR的全部内容,希望文章能够帮你解决ANR所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部