如何修复此AndroidANR?

时间:2018-08-24 11:40:31

标签: android logcat

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过载,有人看到过类似的问题吗?请提供帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

***请检查您的代码,您是否在阻止UI并导致“应用程序无响应”的主UI线程上执行任何繁重的任务,这似乎表明您的设备已挂起。

您可以在后台线程上执行繁重的任务以避免ANR。

请仔细阅读以下说明***

通常,如果应用程序无法响应用户输入,则系统会显示ANR。例如,如果某个应用程序阻止了UI线程上的某些I / O操作(通常是网络访问),则系统将无法处理传入的用户输入事件。或者,该应用可能花费过多的时间来构建精致的内存结构或在UI线程上计算游戏的下一步动作。确保这些计算高效,这始终很重要,但是即使是最高效的代码也需要花费时间才能运行。

在任何情况下,如果应用程序可能执行冗长的操作,则不应在UI线程上执行工作,而应创建工作线程并在其中执行大部分工作。这样可以使UI线程(驱动用户界面事件循环)保持运行,并防止系统断定您的代码已冻结。由于此类线程通常是在类级别完成的,因此您可以将响应性视为类问题。 (将此与基本代码性能进行比较,这是方法级别的问题。)

在Android中,应用程序的响应性由活动管理器和窗口管理器系统服务监视。当检测到以下情况之一时,Android将显示特定应用程序的ANR对话框:

5秒钟内未响应输入事件(例如按键或屏幕触摸事件)。 广播接收器在10秒内还没有完成执行。

如何避免ANR

Android应用程序通常在默认情况下完全在单个线程(“ UI线程”或“主线程”)上运行。这意味着您的应用程序在UI线程中需要很长时间才能完成的所有操作都可能触发ANR对话框,因为您的应用程序没有给自己机会来处理输入事件或意图广播。

因此,在UI线程中运行的任何方法都应在该线程上做尽可能少的工作。特别是,活动应尽可能少地在关键生命周期方法(如onCreate()和onResume())中进行设置。可能需要长时间运行的操作(例如网络或数据库操作)或计算量大的计算(例如调整位图的大小)应在工作线程中进行(或在数据库操作的情况下,通过异步请求进行)。

为更长的操作创建工作线程的最有效方法是使用AsyncTask类。只需扩展AsyncTask并实现doInBackground()方法即可执行工作。要将进度更改发布给用户,可以调用publishProgress(),后者将调用onProgressUpdate()回调方法。从onProgressUpdate()的实现(在UI线程上运行),您可以通知用户。