ANR原因以及解决方法

Android  2019年4月28日 am9:02发布6年前 (2019)更新 91es.com站长
98 0 0

 

一. ANR (Application Not Responding)的定义?

Android上,应用程序如果没有响应,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择等待或者强制关闭。

一个流畅的合理的应用程序中不应该出现ANR,因此,在程序里对响应性能的设计很重要!

二.什么时候出现ANR出现

  1. 按键或触摸事件 5s 内无响应;
  2. BroadcastReceiver 10s 内无法处理完成;
  3. Service 在 20s 时间内无法处理完成;

三.出现ANR的原因

  1. UI 主线程被其他操作阻塞;
  2. 主线程存在耗时操作(本地 IO操作、网络访问、循环等);

四.如何分析ANR问题

一般Android系统中出现ANR后,会在data/anr/保存ANR的相关日志。

1、CPU 问题

在 Monkeylog.log 文件中定位到 "anr in" 位置,查看 cpu usage  total 占用,如发现接近100%,暂时判断为 cpu 问题。
然后在 logcat.log 文件中定位到 "not responding" 发生时间,并截取
cpuinfo.log 中时间点前后 5s 的 log,然后计算 CPU 占中,看哪个进程用的多,在酌情分析模块的 CPU 占中。

2、GC 问题

定位到 logcat.log 文件中 "not responding" 发生时间点;

去查看发生 ANR 时间点对应的 trace 文件,定位到应用报名,若Dalvik Thread主线程显示“SUSPENDED”,则为内存问题。

截取 ANR 发生时间点前 5s 的 log,分析 "dalvikvm" 打印的 Paused GC 耗时,如果过多则定位为 GC 问题,需要查看这 5s 件发生了哪些耗时的操作。

注意:发生 GC 的进程 id 需要和当前发生 ANR 的线程 id 的要一致

五.如何避免ANR

  1. 合理使用 UI 主线程,耗时操作放入其他线程工作;
  2. 合理使用 Handler 异步消息处理机制来处理其他线程请求。
  3. 合理使用并遵循 Android 生命周期, 避免在 onCreate() and onResume()做过多的事情;
  4. 使用一些架构形成规范来避免内存等问题,例如:MVP、RxJava;
  5. 经常使用工具来检查内存问题,例如:MAT、TraceView、AS 自带等工具;
  6. 避免加载大图片引起内存不足导致 ANR;
  7. 避免内存泄露引起的 ANR。

六.总结与额外注意

ANR异常也是在程序中自己经常遇到的问题,主要的解决办法自己最常用的就是不要在主线程中做耗时的操作,而应放在子线程中来实现,比如采用Handler+mesage的方式,或者是有时候需要做一些和网络相互交互的耗时操作就采用asyntask异步任务的方式(它的底层其实Handler+mesage有所区别的是它是线程池)等。

面试可能会问到:如何快速找到ANR的原因

答:Log和trace文件。 (答案仅供参考)

本文转自《Android ANR错误的原因以及解决方法(Application Not Responding)》同时也修改部分内容。感谢

 历史上的今天

  1. 2024: adb多个设备控制(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

wordpress隐藏文章的部分内容,登录可见

前言隐藏文章的部分内容,需要注册登录网站后可见正文下面是实现代码和使用方式。function.php 末尾/** * WordPress 只允许已登录的用户查看文章内容 */add_shortcode( 'members_only', 'members_only_shortcode...

XXXX: unexpected operator

最近在用.sh脚本时,明明可以运行的语句,但报错了比如“[: -ne: unexpected operator”因此查询到《解决Linux下编译.sh文件报错 “[: XXXX: unexpected operator”》这篇文章,觉得不错,摘抄于此。使用粗体字语句就可以搞定。3q然后我就表...

编译Android源码,并刷入Nexus7真机

编译Android源码,并刷入Nexus7真机时我使用的如下配置(后来我Ubuntu 16也编译成功)编译环境:Ubuntu 14.04源码版本:Android6.0真实设备:Nexus7 wifi 第二代(flo)本教程是为Nexus7而写的,当然其他的Nexus设备也可...

林清玄:和时间赛跑

读小学的时候,我的外祖母去世了。外祖母生前最疼爱我。我无法排除自己的忧伤,每天在学校的操场上一圈一圈地跑着,跑得累倒在地上,扑在草坪上痛哭。那哀痛的日子持续了很久,爸爸妈妈也不知道如何安慰我。他们知道与其欺骗我说外祖母睡着了,还不如对我说实话:外祖母永远不会回来了。“什么是永远不会回来了呢?”我问...

Android图片倒影记录

前言Android对图片进行倒影处理。也就是对底部进行一定高度的翻转。具体效果如图正文直接上代码<!-- layout_height= 倒影高度+分割线高度+图片高度,否则显示不全 --><com.biumall.reflectview.view.Reflect...

川端康成:花未眠

我常常不可思议地思考一些微不足道的问题。昨日一来到热海的旅馆,旅馆的人拿来了与壁龛里的花不同的海棠花。我太劳顿,早早就人睡了。凌晨四点醒来,发现海棠花未眠。发现花未眠,我大吃一惊。有葫芦花和夜来香,也有牵牛花和合欢花,这些花差不多都是昼夜绽放的。花在夜间是不眠的。这是众所周知的事。可我仿佛才明白过...