如何解决这个AndroidANR?
How to fix this AndroidANR?
mainThread的TraceFile:(此调用栈来自系统库,mainThread好像被锁住了)
"main" prio=5 tid=1 Native
| group="main" sCount=1 dsCount=0 obj=0x7454c5c8 self=0xb4cb6500
| sysTid=11238 nice=0 cgrp=default sched=0/0 handle=0xb6f19b34
| state=S schedstat=( 111248118635 36668819001 451360 ) utm=7881 stm=3243 core=0 HZ=100
| stack=0xbe1a4000-0xbe1a6000 stackSize=8MB
| held mutexes=
kernel: (couldn't read /proc/self/task/11238/stack)
native: #00 pc 00017640 /system/lib/libc.so (syscall+28)
native: #01 pc 000f6e09 /system/lib/libart.so (_ZN3art17ConditionVariable4WaitEPNS_6ThreadE+96)
native: #02 pc 00291bb3 /system/lib/libart.so (_ZN3art3JNI16CallObjectMethodEP7_JNIEnvP8_jobjectP10_jmethodIDz+658)
native: #03 pc 00002bbb /system/lib/libnativehelper.so (jniGetReferent+94)
native: #04 pc 000af741 /system/lib/libandroid_runtime.so (???)
native: #05 pc 00012e93 /system/lib/libutils.so (_ZN7android6Looper9pollInnerEi+530)
native: #06 pc 00012f63 /system/lib/libutils.so (_ZN7android6Looper8pollOnceEiPiS1_PPv+130)
native: #07 pc 00086b0d /system/lib/libandroid_runtime.so (_ZN7android18NativeMessageQueue8pollOnceEP7_JNIEnvP8_jobjecti+22)
native: #08 pc 0000055d /data/dalvik-cache/arm/system@framework@boot.oat (Java_android_os_MessageQueue_nativePollOnce__JI+96)
at android.os.MessageQueue.nativePollOnce(Native method)
at android.os.MessageQueue.next(MessageQueue.java:323)
at android.os.Looper.loop(Looper.java:141)
at android.app.ActivityThread.main(ActivityThread.java:5653)
at java.lang.reflect.Method.invoke!(Native method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:746)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
此 ANR 的 adbLog 文件:
08-24 19:06:55.611 1751 1814 E ActivityManager: ANR in com.
08-24 19:06:55.611 1751 1814 E ActivityManager: PID: 11220
08-24 19:06:55.611 1751 1814 E ActivityManager: Reason: Input dispatching timed out (com, Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago. Wait queue length: 46. Wait queue head age: 5508.2ms.)
08-24 19:06:55.611 1751 1814 E ActivityManager: Load: 11.81 / 11.91 / 11.85
08-24 19:06:55.611 1751 1814 E ActivityManager: CPU usage from 666215ms to 0ms ago:
08-24 19:06:55.611 1751 1814 E ActivityManager: 62% 562/sensors.qcom: 50% user + 11% kernel / faults: 198 minor
08-24 19:06:55.611 1751 1814 E ActivityManager: 9.5% 1751/system_server: 6.2% user + 3.3% kernel / faults: 5363 minor 2 major
08-24 19:06:55.611 1751 1814 E ActivityManager: 1.8% 1465/kworker/u:1: 0% user + 1.8% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 1.7% 30539/kworker/u:5: 0% user + 1.7% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 1.7% 10878/kworker/u:3: 0% user + 1.7% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 1.7% 4805/kworker/u:2: 0% user + 1.7% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 1.6% 12028/com.navi.tracker:remote: 1.3% user + 0.3% kernel / faults: 3968 minor
08-24 19:06:55.611 1751 1814 E ActivityManager: 1% 347/mediaserver: 0.2% user + 0.8% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.9% 4977/mpdecision: 0% user + 0.8% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.8% 222/logd: 0.5% user + 0.3% kernel / faults: 19 minor
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.6% 7/kworker/u:0H: 0% user + 0.6% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.6% 208/ueventd: 0.2% user + 0.4% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.6% 427/irq/33-cpubw_hw: 0% user + 0.6% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.6% 11973/com.navi.tracker: 0.4% user + 0.2% kernel / faults: 1345 minor
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.6% 3745/com.android.phone: 0.4% user + 0.2% kernel / faults: 2342 minor
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.5% 2791/com.android.systemui: 0.3% user + 0.1% kernel / faults: 973 minor
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.5% 276/surfaceflinger: 0.2% user + 0.3% kernel / faults: 5 minor
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.5% 2747/MC_Thread: 0% user + 0.5% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.4% 3543/com.xiaomi.metoknlp: 0.3% user + 0.1% kernel / faults: 1652 minor
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.3% 3/ksoftirqd/0: 0% user + 0.3% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.3% 163/cfinteractive: 0% user + 0.3% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.3% 26051/kworker/3:1H: 0% user + 0.3% kernel
我怀疑是cpu超载了,有没有人遇到过类似的问题?请大家帮忙,谢谢。
***请检查您的代码,您正在主 UI 线程上执行任何繁重的任务,这些任务会阻塞 UI 并导致 "Application Not Responding" 您的设备似乎已挂起。
您可以在后台线程上执行繁重的任务以避免 ANR。
请仔细阅读以下注释***
通常,如果应用程序无法响应用户输入,系统会显示 ANR。例如,如果应用程序在 UI 线程上阻塞某些 I/O 操作(通常是网络访问),则系统无法处理传入的用户输入事件。或者应用程序可能花费太多时间构建复杂的内存结构或在 UI 线程上计算游戏的下一步。确保这些计算高效始终很重要,但即使是最高效的代码仍然需要时间 运行.
在您的应用执行可能耗时的操作的任何情况下,您都不应该在 UI 线程上执行工作,而是创建一个工作线程并在那里完成大部分工作。这使 UI 线程(驱动用户界面事件循环)保持 运行ning 并防止系统断定您的代码已冻结。由于此类线程通常在 class 级别完成,因此您可以将响应视为 class 问题。 (将此与基本代码性能进行比较,后者是方法级别的问题。)
在 Android 中,应用程序响应由 Activity Manager 和 Window Manager 系统服务监控。 Android 将在检测到以下情况之一时显示特定应用程序的 ANR 对话框:
5 秒内没有对输入事件(例如按键或屏幕触摸事件)的响应。
BroadcastReceiver 未在 10 秒内完成执行。
如何避免 ANR
Android 应用程序通常 运行 默认情况下完全在单个线程上 "UI thread" 或 "main thread")。这意味着您的应用程序在 UI 线程中执行的任何需要很长时间才能完成的操作都可能触发 ANR 对话框,因为您的应用程序没有给自己处理输入事件或意图广播的机会。
因此,UI 线程中 运行 的任何方法都应该在该线程上做尽可能少的工作。特别是,活动应该尽可能少地设置关键的生命周期方法,例如 onCreate() 和 onResume()。可能较长的 运行ning 操作(如网络或数据库操作)或计算量大的计算(如调整位图大小)应在工作线程中完成(或者在数据库操作的情况下,通过异步请求)。
为较长的操作创建工作线程的最有效方法是使用 AsyncTask class。只需扩展 AsyncTask 并实现 doInBackground() 方法即可执行工作。要向用户 post 进行进度更改,您可以调用 publishProgress(),它会调用 onProgressUpdate() 回调方法。从您的 onProgressUpdate() 实现(UI 线程上的 运行s),您可以通知用户。
mainThread的TraceFile:(此调用栈来自系统库,mainThread好像被锁住了)
"main" prio=5 tid=1 Native
| group="main" sCount=1 dsCount=0 obj=0x7454c5c8 self=0xb4cb6500
| sysTid=11238 nice=0 cgrp=default sched=0/0 handle=0xb6f19b34
| state=S schedstat=( 111248118635 36668819001 451360 ) utm=7881 stm=3243 core=0 HZ=100
| stack=0xbe1a4000-0xbe1a6000 stackSize=8MB
| held mutexes=
kernel: (couldn't read /proc/self/task/11238/stack)
native: #00 pc 00017640 /system/lib/libc.so (syscall+28)
native: #01 pc 000f6e09 /system/lib/libart.so (_ZN3art17ConditionVariable4WaitEPNS_6ThreadE+96)
native: #02 pc 00291bb3 /system/lib/libart.so (_ZN3art3JNI16CallObjectMethodEP7_JNIEnvP8_jobjectP10_jmethodIDz+658)
native: #03 pc 00002bbb /system/lib/libnativehelper.so (jniGetReferent+94)
native: #04 pc 000af741 /system/lib/libandroid_runtime.so (???)
native: #05 pc 00012e93 /system/lib/libutils.so (_ZN7android6Looper9pollInnerEi+530)
native: #06 pc 00012f63 /system/lib/libutils.so (_ZN7android6Looper8pollOnceEiPiS1_PPv+130)
native: #07 pc 00086b0d /system/lib/libandroid_runtime.so (_ZN7android18NativeMessageQueue8pollOnceEP7_JNIEnvP8_jobjecti+22)
native: #08 pc 0000055d /data/dalvik-cache/arm/system@framework@boot.oat (Java_android_os_MessageQueue_nativePollOnce__JI+96)
at android.os.MessageQueue.nativePollOnce(Native method)
at android.os.MessageQueue.next(MessageQueue.java:323)
at android.os.Looper.loop(Looper.java:141)
at android.app.ActivityThread.main(ActivityThread.java:5653)
at java.lang.reflect.Method.invoke!(Native method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:746)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
此 ANR 的 adbLog 文件:
08-24 19:06:55.611 1751 1814 E ActivityManager: ANR in com.
08-24 19:06:55.611 1751 1814 E ActivityManager: PID: 11220
08-24 19:06:55.611 1751 1814 E ActivityManager: Reason: Input dispatching timed out (com, Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago. Wait queue length: 46. Wait queue head age: 5508.2ms.)
08-24 19:06:55.611 1751 1814 E ActivityManager: Load: 11.81 / 11.91 / 11.85
08-24 19:06:55.611 1751 1814 E ActivityManager: CPU usage from 666215ms to 0ms ago:
08-24 19:06:55.611 1751 1814 E ActivityManager: 62% 562/sensors.qcom: 50% user + 11% kernel / faults: 198 minor
08-24 19:06:55.611 1751 1814 E ActivityManager: 9.5% 1751/system_server: 6.2% user + 3.3% kernel / faults: 5363 minor 2 major
08-24 19:06:55.611 1751 1814 E ActivityManager: 1.8% 1465/kworker/u:1: 0% user + 1.8% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 1.7% 30539/kworker/u:5: 0% user + 1.7% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 1.7% 10878/kworker/u:3: 0% user + 1.7% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 1.7% 4805/kworker/u:2: 0% user + 1.7% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 1.6% 12028/com.navi.tracker:remote: 1.3% user + 0.3% kernel / faults: 3968 minor
08-24 19:06:55.611 1751 1814 E ActivityManager: 1% 347/mediaserver: 0.2% user + 0.8% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.9% 4977/mpdecision: 0% user + 0.8% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.8% 222/logd: 0.5% user + 0.3% kernel / faults: 19 minor
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.6% 7/kworker/u:0H: 0% user + 0.6% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.6% 208/ueventd: 0.2% user + 0.4% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.6% 427/irq/33-cpubw_hw: 0% user + 0.6% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.6% 11973/com.navi.tracker: 0.4% user + 0.2% kernel / faults: 1345 minor
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.6% 3745/com.android.phone: 0.4% user + 0.2% kernel / faults: 2342 minor
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.5% 2791/com.android.systemui: 0.3% user + 0.1% kernel / faults: 973 minor
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.5% 276/surfaceflinger: 0.2% user + 0.3% kernel / faults: 5 minor
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.5% 2747/MC_Thread: 0% user + 0.5% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.4% 3543/com.xiaomi.metoknlp: 0.3% user + 0.1% kernel / faults: 1652 minor
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.3% 3/ksoftirqd/0: 0% user + 0.3% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.3% 163/cfinteractive: 0% user + 0.3% kernel
08-24 19:06:55.611 1751 1814 E ActivityManager: 0.3% 26051/kworker/3:1H: 0% user + 0.3% kernel
我怀疑是cpu超载了,有没有人遇到过类似的问题?请大家帮忙,谢谢。
***请检查您的代码,您正在主 UI 线程上执行任何繁重的任务,这些任务会阻塞 UI 并导致 "Application Not Responding" 您的设备似乎已挂起。
您可以在后台线程上执行繁重的任务以避免 ANR。
请仔细阅读以下注释***
通常,如果应用程序无法响应用户输入,系统会显示 ANR。例如,如果应用程序在 UI 线程上阻塞某些 I/O 操作(通常是网络访问),则系统无法处理传入的用户输入事件。或者应用程序可能花费太多时间构建复杂的内存结构或在 UI 线程上计算游戏的下一步。确保这些计算高效始终很重要,但即使是最高效的代码仍然需要时间 运行.
在您的应用执行可能耗时的操作的任何情况下,您都不应该在 UI 线程上执行工作,而是创建一个工作线程并在那里完成大部分工作。这使 UI 线程(驱动用户界面事件循环)保持 运行ning 并防止系统断定您的代码已冻结。由于此类线程通常在 class 级别完成,因此您可以将响应视为 class 问题。 (将此与基本代码性能进行比较,后者是方法级别的问题。)
在 Android 中,应用程序响应由 Activity Manager 和 Window Manager 系统服务监控。 Android 将在检测到以下情况之一时显示特定应用程序的 ANR 对话框:
5 秒内没有对输入事件(例如按键或屏幕触摸事件)的响应。 BroadcastReceiver 未在 10 秒内完成执行。
如何避免 ANR
Android 应用程序通常 运行 默认情况下完全在单个线程上 "UI thread" 或 "main thread")。这意味着您的应用程序在 UI 线程中执行的任何需要很长时间才能完成的操作都可能触发 ANR 对话框,因为您的应用程序没有给自己处理输入事件或意图广播的机会。
因此,UI 线程中 运行 的任何方法都应该在该线程上做尽可能少的工作。特别是,活动应该尽可能少地设置关键的生命周期方法,例如 onCreate() 和 onResume()。可能较长的 运行ning 操作(如网络或数据库操作)或计算量大的计算(如调整位图大小)应在工作线程中完成(或者在数据库操作的情况下,通过异步请求)。
为较长的操作创建工作线程的最有效方法是使用 AsyncTask class。只需扩展 AsyncTask 并实现 doInBackground() 方法即可执行工作。要向用户 post 进行进度更改,您可以调用 publishProgress(),它会调用 onProgressUpdate() 回调方法。从您的 onProgressUpdate() 实现(UI 线程上的 运行s),您可以通知用户。