专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

探索App性能优化之稳定性优化-避免出现ANR

一、什么是ANR

ANR是Android中的概念,全称Application Not Responding(应用程序无响应),会弹出:页面无响应的对话框。如何定位和避免是Android程序员的必备修养。

二、发生ANR的条件

应用程序的响应性是由ActivityManager和WindowManager系统服务监视的,当ANR发生条件满足时,就会弹出ANR的对话框。

  • 1.Activity超过5秒无响应;
  • 2.BroadcastReceiver超过10秒无响应;
  • 3.ervice超过20秒无响应;

三、造成ANR的主要原因

当应用程序的UI线程响应超时才会引起ANR,超时产生的原因有两种:

  • 1.当前事件被某个事件给阻塞掉了,例如UI线程正在响应另外的事件;
  • 2.当前事件正在处理,但是由于耗时太长没有能及时的完成;

四、典型的ANR问题场景

  • 1.应用程序UI线程存在耗时操作(在UI线程中进行网络请求、数据库操作文件操作),可能会导致UI线程无法及时处理用户输入等;
  • 2.应用程序UI线程等待子线程释放某个锁,从而无法处理用户的请求的输入;
  • 3.耗时操作的动画需要大量的计算工作,可能导致CPU负载过重;
  • 4.垃圾设备中,弱网络,频繁操作

五、注意事项

  • 1.主线程被IO操作阻塞;
  • 2.Activity的所有生命周期回调都是执行在主线程的;
  • 3.Service默认执行在主线程中;
  • 4.BoardcastReceiver的回调onReceive()执行在主线程中;
  • 5.AsyncTask的回调除了doInBackground,其他都是在主线程中;
  • 6.没有使用子线程Looper的Handler的handlerMessage,post(Runnable)都是执行在主线程中;

六、如何解决ANR

ANR避免的思想:避免在主线程中做耗时操作。

  • 1.使用AsyncTask处理耗时IO操作
  • 2.使用Thread或HandlerThread提高优先级
  • 3.使用Handler处理工作线程的耗时操作
  • 4.Activity的onCreate和onResume回调尽量避免耗时操作

七、ANR定位和分析

ANR定位(traces文件):ANR日志存在/data/anr/traces.txt,可以分析logcat日志和traces文件的相关信息输出去定位出现ANR的原因。

主要包含以下几方面:

  • 1.基本信息,包括进程名、进程号、包名、系统build号、ANR类型等;
  • 2.CPU使用信息,包括活跃进程的CPU 平均占用率、IO情况等;
  • 3.线程堆栈信息,所属进程包括发生ANR的进程、其父进程、最近有活动的3个进程等。

八、ANR的检测工具

BlockCanary使用方式和LeakCanary相同

文章永久链接:https://tech.souyunku.com/27637

未经允许不得转载:搜云库技术团队 » 探索App性能优化之稳定性优化-避免出现ANR

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们