2011-09-03 4 views
0

뭔가 이상한 점이 있습니다. 내 활동 시간이 정지되고 시스템에서 ARN이 발생합니다.활동이 응답하지 않음 시작 시간의 절반도

얼마 전에 ANG 문제없이 AndEngine + PhysicsBox2d 확장 프로그램에서 간단한 게임을 썼습니다. 지난 며칠 동안 코드를 리팩터링하면서 시작 구성을 처리하고 코드를 이동시켜 응집력을 향상시키는 두 가지 클래스를 소개했습니다. 행동 변화가 전혀 구현되지 않는 것이 이상적입니다. 그러나 이제 앱을 열고 정상적으로 닫으면 두 번째로 열면 앱이 멈추고 시간이 초과 될 때까지 강제 종료됩니다. 다음은 로그의 출력입니다 :

09-03 19:41:40.416: ERROR/ActivityManager(138): ANR in mp.andreabarbadoro.mama (mp.andreabarbadoro.mama/.DaisyGameActivity) 
09-03 19:41:40.416: ERROR/ActivityManager(138): Reason: keyDispatchingTimedOut 
09-03 19:41:40.416: ERROR/ActivityManager(138): Load: 2.77/2.62/2.35 
09-03 19:41:40.416: ERROR/ActivityManager(138): CPU usage from 13439ms to 0ms ago with 99% awake: 
09-03 19:41:40.416: ERROR/ActivityManager(138): 3.2% 116/akmd: 0.9% user + 2.3% kernel 
09-03 19:41:40.416: ERROR/ActivityManager(138): 2% 1679/mp.andreabarbadoro.mama: 2% user + 0% kernel/faults: 3 minor 
09-03 19:41:40.416: ERROR/ActivityManager(138): 1.6% 138/system_server: 1% user + 0.5% kernel/faults: 3 minor 1 major 
09-03 19:41:40.416: ERROR/ActivityManager(138): 0.5% 228/com.android.launcher: 0.5% user + 0% kernel/faults: 57 minor 
09-03 19:41:40.416: ERROR/ActivityManager(138): 0.6% 1697/kworker/0:1: 0% user + 0.6% kernel 
09-03 19:41:40.416: ERROR/ActivityManager(138): 0% 67/yaffs-bg-1: 0% user + 0% kernel 
09-03 19:41:40.416: ERROR/ActivityManager(138): 0% 1699/logcat: 0% user + 0% kernel 
09-03 19:41:40.416: ERROR/ActivityManager(138): 1.4% TOTAL: 1.2% user + 0.2% kernel 
09-03 19:41:40.416: ERROR/ActivityManager(138): CPU usage from 1542ms to 2104ms later: 
09-03 19:41:40.416: ERROR/ActivityManager(138): 10% 138/system_server: 3.5% user + 7.1% kernel 
09-03 19:41:40.416: ERROR/ActivityManager(138):  3.5% 173/InputDispatcher: 3.5% user + 0% kernel 
09-03 19:41:40.416: ERROR/ActivityManager(138):  1.7% 149/SensorService: 1.7% user + 0% kernel 
09-03 19:41:40.416: ERROR/ActivityManager(138): 3.5% 116/akmd: 0% user + 3.5% kernel 
09-03 19:41:40.416: ERROR/ActivityManager(138):  3.5% 1694/akmd: 0% user + 3.5% kernel 
09-03 19:41:40.416: ERROR/ActivityManager(138): 3.5% 1679/mp.andreabarbadoro.mama: 3.5% user + 0% kernel 
09-03 19:41:40.416: ERROR/ActivityManager(138):  3.5% 1688/er$SensorThread: 1.7% user + 1.7% kernel 
09-03 19:41:40.416: ERROR/ActivityManager(138): 0.9% 1697/kworker/0:1: 0% user + 0.9% kernel 
09-03 19:41:40.416: ERROR/ActivityManager(138): 10% TOTAL: 7.1% user + 3.5% kernel 
09-03 19:41:50.756: WARN/ActivityManager(138): Force finishing activity mp.andreabarbadoro.mama/.DaisyGameActivity 

그래서, 어떤 생각이 버그를 찾기 위해 시작은?

편집 : Activity.onDestroy 방법의 중단에 대한 디버그 창에보고 후, 내가 활동이 사망 한 후 android.hardware.sensormanager $ SensorThread가 아직 살아 보를 모십니다 것 같다 방법을 볼 수 있습니다. 이것이 정상적인 동작입니까?

답변

1

주 스레드의 스택 추적을보고 /data/anr/traces.txt를 볼 수 있습니다. (이 파일이 새 ANR로 겹쳐 쓰여지지 않았다고 가정).

+0

내 ANR은 다중 스레드 환경에서 활동의 수명주기에 대한 하위 최적 이해 때문에 발생하는 미묘한 버그의 증상이었습니다. 당신의 팁은 내가 겪었던 교착 상태를 격리시키는 것을 도왔습니다. 새로운 것을 발견하게 해주셔서 감사합니다! – andijcr

0

onCreate 메소드에서 무엇을하고 있습니까? 그것은 당신이 다른 스레드에서 처리 해야하는 무거운 물건을하고있는 것 같습니다.

코드를 보지 않고서는 문제를 지적하기가 매우 어려울 것입니다 ... 그래서 지금 제 제안은 무거운 작업을위한 스레드를 시작하는 것입니다. 스레드가 완료 될 때까지 스플래시 화면/진행 대화 상자 표시 (해당 작업에 AsyncTask를 사용할 수 있음)

0

ANR의 의미 : 입력 이벤트를 올바르게 처리 할 수 ​​없도록 특정 시간 (5 초, What Triggers ANR? 참조) 동안 주/UI 스레드를 차단하고 있음을 기억하십시오.

아마도이 스레드 내부에서 무거운 작업을하고 있습니다. onResume() 또는 onRestart()에서 실행했을 수 있습니다. 이러한 비싼 작업을 찾기 시작하여 별도의 스레드 (예 : AsyncTasks 경유)로 실행해야합니다. 앱에서 비용이 많이 드는 작업이 무엇인지 잘 모르겠 으면 traceview으로 측정 해보십시오. 멋진 소개를 위해 안드로이드 개발자 블로그에 this post을 참조하십시오.