我是靠谱客的博主 隐形翅膀,最近开发中收集的这篇文章主要介绍ANR异常,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

作为一个开发人员,即使你不知道ANR异常,你肯定也遇到过程序无响应,其实ANR就是程序无响应(Application Not Responding)。那么什么是ANR呢?

一、什么是ANR?

ANR就是Application Not Responding,是安卓中弹出的一个对话框,让用户来选择等待或者直接关闭程序。activity响应超过5秒,service响应超过10秒,都会出现ANR。

二、ANR产生的原因

刚才也说了,activity响应超过5秒,service响应超过10秒,都会出现ANR。那么为什么activity或者service会用这么长时间来响应呢?最大的原因可能就是主线程被阻塞了。所以产生ANR的原因有以下两个:

  • 主线程中存在耗时的计算
  • 主线程被IO操作阻塞(安卓4.0以后,网络IO禁止在主线程执行)

那么安卓中有哪些是在主线程中执行的呢?

  • activity的所有生命周期方法;
  • service默认是在主线程的;、
  • broadcast中的onReceive()回调方法;
  • AsyncTask中除了doInBackgroud方法,其他的四个方法都是在主线程中的;
  • Handler的handleMessage()和post(Runnable)方法,前提是这个Handler没有使用子线程的looper。

基本上就是这么多,所以在上述这些方法中是绝对不能做耗时操作的,否则就会出现ANR异常。

三、怎么避免ANR?

避免ANR的总方针就是不要阻塞主线程,具体的方法有以下这些:

  • 使用AsyncTask来进行耗时操作;
  • 使用Thread或者HandlerThread来提高线程优先级;
  • 使用Handler来处理工作线程;
  • 不要在Activity中执行耗时的计算。

一般做到以上几步就可以避免ANR了。

最后

以上就是隐形翅膀为你收集整理的ANR异常的全部内容,希望文章能够帮你解决ANR异常所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部