ANR(Application Not Responding)定义

在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。所以一个流畅的合理的应用程序中不能出现anr,而让用户每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样系统不会显示ANR给用户。

出现ANR的原因

默认情况下,在android中Activity的最长执行时间是5秒,BroadcastReceiver的最长执行时间则是10秒。超出就会提示应用程序无响应(ANR:Application Not Responding)对话框。

三种常见类型

1:KeyDispatchTimeout(5 seconds) --主要类型

按键或触摸事件在特定时间内无响应

2BroadcastTimeout(10 seconds)

BroadcastReceiver在特定时间内无法处理完成

3:ServiceTimeout(20 seconds) --小概率类型

Service在特定的时间内无法处理完成

如何分析ANR生成的Traces

出现Application Not Responding的提示后,系统会将日志LOG写到到data\anr\traces.txt文件 举一个简单的例子,下面给出一段日志LOG供参考
DALVIK THREADS:(mutexes: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0)"main" prio=5 tid=1 NATIVE  | group="main" sCount=1 dsCount=0 obj=0x40025340 self=0xd180  | sysTid=1071 nice=0 sched=0/0 cgrp=default handle=-1344994080  | schedstat=( 2355584448 1199910712 3410 )  at java.net.InetAddress.getaddrinfo(Native Method)  at java.net.InetAddress.lookupHostByName(InetAddress.java:540)  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:333)  at java.net.InetAddress.getAllByName(InetAddress.java:295)  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:100)  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:79)  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect(HttpConnection.java:353)  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:120)  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpConnection(HttpURLConnectionImpl.java:316)  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConnection(HttpURLConnectionImpl.java:298)  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:236)  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:645)  at com.rayray.cool.util.URLUtil.invokeURL(URLUtil.java:136)  at com.rayray.cool.activity.WoDeJianYiActivity$1.onClick(WoDeJianYiActivity.java:173)  at android.view.View.performClick(View.java:2535)  at android.view.View$PerformClick.run(View.java:9129)  at android.os.Handler.handleCallback(Handler.java:618)  at android.os.Handler.dispatchMessage(Handler.java:123)  at android.os.Looper.loop(SourceFile:351)  at android.app.ActivityThread.main(ActivityThread.java:3821)  at java.lang.reflect.Method.invokeNative(Native Method)  at java.lang.reflect.Method.invoke(Method.java:538)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:969)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:727)  at dalvik.system.NativeStart.main(Native Method)

出现ANR问题的原因就是上面红色代码中

at com.rayray.cool.activity.WoDeJianYiActivity$1.onClick(WoDeJianYiActivity.java:173) 是Android中Activity
at com.rayray.cool.util.URLUtil.invokeURL(URLUtil.java:136) 是一次耗时的联网请求


Activity中的按键事件在特定事件内未响应造成。


如何解决ANR

(1)耗时的操作放入单独的线程中处理,如(联网、数据库、IO)

(2)尽量避免和UI线程的操作


更多相关文章

  1. 国内Android(安卓)市场调查
  2. 了解Android(安卓)WebView
  3. [转载]Android实现更换皮肤功能
  4. Android(安卓)应用程序窗体显示状态操作(requestWindowFeature()
  5. 安卓数据库sqlite增删查改—模拟用户登录与管理(2020-6-19)
  6. android SQLite实现本地登录注册功能,SQLite简单应用(android stu
  7. Android(安卓)UI 之困境:统一还是分化
  8. 什么是ANR,如何避免?
  9. 收藏老罗的----------Android应用程序组件Content Provider简要

随机推荐

  1. 关于AndroidManifest.xml中的android:deb
  2. Android判断当前网络是否可用
  3. Android加载字体包及封装
  4. Android多用户原理
  5. mac 上的android源码下载编译查看
  6. 我的android 第9天 - 文件存储
  7. RecyclerView的使用
  8. 2010.05.15学习日志
  9. 解决mac下adb devices命令找不到设备
  10. android 获取 USB 拔插广播消息