【问题标题】:ANR when screen turns off, BroadcastReceiver related issue屏幕关闭时出现 ANR,BroadcastReceiver 相关问题
【发布时间】:2015-02-03 00:15:53
【问题描述】:

我正在使用的应用程序在屏幕打开时可以正常工作,并且可以在任何时间长度内正常工作,但是一旦手机进入睡眠状态并经过 10 秒,我的 logcat 就会出现错误,

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

我提取了跟踪文件并试图了解导致此问题的原因并阅读了androids page 的应用程序性能,我发现这是因为广播接收器在 10 秒内没有执行,

BroadcastReceiver 未在 10 秒内完成执行。

通过阅读trace文件,我认为这与正在播放的屏幕超时和未完成的动作有关。

"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)

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

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

非常感谢任何帮助。

【问题讨论】:

  • 请发布您的源代码。
  • 对此是否有任何一般性反馈?我无法发布代码,因为该项目处于 NDA 之下,而且代码庞大且分散。请根据您在错误日志中看到的内容给我任何反馈

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


【解决方案1】:

我在这里遇到了同样的问题,操作不应该花费这么多时间,但出于某种原因,确实如此。

来自官方 Android 文档:

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

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

【讨论】:

    猜你喜欢
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多