屏幕关闭时ANR,BroadcastReceiver相关问题

时间:2015-02-03 00:15:53

标签: android performance broadcastreceiver android-wake-lock android-anr-dialog

我正在处理的应用程序,在屏幕打开时正常工作,并且持续一段时间,但是一旦手机进入睡眠状态并且已经过了10秒,我的logcat中出现错误,

I/art Thread[5,tid=318,WaitingInMainSignalCatcherLoop,Thread*=0xaf60e400,peer=0x12c00080,"Signal Catcher"]: reacting to signal 3

我删除了跟踪文件并尝试了解导致此问题的原因并通过androids page阅读有关应用程序性能的信息,我已经发现,这是因为BroadcastReceiver未在10中执行秒,

  

BroadcastReceiver还没有在10秒内完成执行。

通过阅读跟踪文件,我认为这与广播屏幕的超时和未完成的操作有关。

"ActivityManager" prio=5 tid=16 TimedWaiting
 | group="main" sCount=1 dsCount=0 obj=0x12d41970 self=0xac884400
 | sysTid=859 nice=-2 cgrp=apps sched=0/0 handle=0xb50e9e80
 | state=S schedstat=( 443987410679 259509083288 699634 ) utm=18416 stm=25982 core=2 HZ=100
 | stack=0xa14fa000-0xa14fc000 stackSize=1036KB
 | held mutexes=
 at java.lang.Object.wait!(Native method)
 - waiting on <0x03423764> (a com.android.server.am.ActivityManagerService$6)
 at java.lang.Object.wait(Object.java:422)
 at com.android.server.am.ActivityManagerService.dumpStackTraces(ActivityManagerService.java:4969)
 - locked <0x03423764> (a com.android.server.am.ActivityManagerService$6)
 at com.android.server.am.ActivityManagerService.dumpStackTraces(ActivityManagerService.java:4946)
 at com.android.server.am.ActivityManagerService.appNotResponding(ActivityManagerService.java:5187)
 at com.android.server.am.BroadcastQueue$AppNotResponding.run(BroadcastQueue.java:171)
 at android.os.Handler.handleCallback(Handler.java:739)
 at android.os.Handler.dispatchMessage(Handler.java:95)
 at android.os.Looper.loop(Looper.java:135)
 at android.os.HandlerThread.run(HandlerThread.java:61)
 at com.android.server.ServiceThread.run(ServiceThread.java:46)

有人可以指出我正确的方向来解决这个问题吗? 如何找到问题的根本原因。

我曾尝试过(在我的无知中)我尝试删除代码中的所有广播接收器,这显然没有帮助。 我摆脱了wakeLocks试图解决这个问题,但这也没有帮助。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我在这里遇到的问题与不应该花费太多时间的操作有关,但出于某种原因,它是。

来自官方Android文档:

  

BroadcastReceiver执行时间的具体约束强调了广播接收器的意图:在后台进行小的,离散的工作量,例如保存设置或注册通知。因此,与UI线程中调用的其他方法一样,应用程序应避免在广播接收器中进行长时间运行或计算。但是,不是通过工作线程执行密集型任务,如果需要采取可能长时间运行的操作来响应意图广播应用程序应启动IntentService。

http://developer.android.com/training/articles/perf-anr.html