2013-11-22 4 views
2

У меня есть приложение, работающее на рынке Android, и я получил 2 журнала ANR.Ошибка ANR с libgdx on pause/resume

Различные имена ANR, но одно и то же место (AndroidGraphics.java:404). Я не знаю, что делать. Может кто-нибудь мне помочь?

Спасибо!

Стек 1: НРУ keyDispatchingTimedOut

JNI: CheckJNI is off; workarounds are off; pins=0; globals=192 (plus 11 weak) 

DALVIK THREADS: 
(mutexes: tll=0 tsl=0 tscl=0 ghl=0) 

"main" prio=5 tid=1 WAIT 
| group="main" sCount=1 dsCount=0 obj=0x42058578 self=0x41522120 
| sysTid=15043 nice=0 sched=0/0 cgrp=apps handle=1074204668 
| state=S schedstat=(0 0 0) utm=1257 stm=809 core=2 
at java.lang.Object.wait(Native Method) 
- waiting on <0x42928d90> (a java.lang.Object) 
at java.lang.Object.wait(Object.java:364) 
at com.badlogic.gdx.backends.android.AndroidGraphics.pause(AndroidGraphics.java:404) 
at com.badlogic.gdx.backends.android.AndroidApplication.onPause(AndroidApplication.java:217) 
at com.packetname.gameName.MainActivity.onPause(MainActivity.java:124) 
at android.app.Activity.performPause(Activity.java:5235) 
at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1233) 
at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3050) 
at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3019) 
at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2997) 
at android.app.ActivityThread.access$800(ActivityThread.java:141) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1267) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:5103) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:525) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
at dalvik.system.NativeStart.main(Native Method) 

Стек 2: НРУ Радиопередача Намерении {действовать = android.intent.action.SCREEN_OFF FLG = 0x50000010}

DALVIK THREADS: 
    (mutexes: tll=0 tsl=0 tscl=0 ghl=0) 

"main" prio=5 tid=1 WAIT 
| group="main" sCount=1 dsCount=0 obj=0x40ba7568 self=0x40b97a18 
| sysTid=1566 nice=0 sched=0/0 cgrp=apps handle=1075324464 
| schedstat=(267164153 509750763 1051) utm=17 stm=9 core=1 
at java.lang.Object.wait(Native Method) 
- waiting on <0x411f0908> (a java.lang.Object) 
at java.lang.Object.wait(Object.java:364) 
at com.badlogic.gdx.backends.android.AndroidGraphics.pause(AndroidGraphics.java:404) 
at com.badlogic.gdx.backends.android.AndroidApplication.onPause(AndroidApplication.java:217) 
at com.packetname.gameName.MainActivity.onPause(MainActivity.java:102) 
at android.app.Activity.performPause(Activity.java:5106) 
at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1225) 
at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2825) 
at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2794) 
at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2772) 
at android.app.ActivityThread.access$800(ActivityThread.java:130) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1206) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4745) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
at dalvik.system.NativeStart.main(Native Method) 

ответ

0

что-то в ваш код кода визуализации висит или просто слишком длинный.

Трассировки стека, которые вы показываете, предназначены для основного потока андроида, который в Libgdx отличается от потока рендеринга, который запускает ваш код libgdx. См. https://code.google.com/p/libgdx/wiki/TheArchitecture#The_Application. Что происходит в пути паузы

  1. Android задает основной поток, чтобы сделать паузу
  2. Основной поток просит libgdx вынести нить паузы (см onPause at AndroidApplication.java line 214), это вызывает graphics.pause()
  3. graphics.pause() (см AndroidGraphics.java line 409), устанавливает флаг pause и вращается, пока флаг не будет очищен.
  4. Флаг pause очищается резьбой рендера в цикле рендеринга (см. в AndroidGraphics).

Если ваш цикл визуализации где-то застрял, флаг паузы никогда не будет очищен, и основной поток не проснется, и Android убьет ваше приложение.

Таким образом, обратная трассировка, которую вы показываете, включает в себя первые три шага (в потоке Android), а не интересную обратную трассировку.

Надеемся, что отчеты об авариях включают в себя обратные трассы для других потоков в вашей системе.

Если это редкий сбой, может случиться так, что ваш цикл рендеринга повесится где-нибудь (не имеющий никакого отношения к коду паузы), пользователь получает раздражение и пытается переключить контексты, а Android пытается приостановить системы, а затем Android злится и убивает ваше приложение. Вот почему вы никогда не должны делать что-либо очень медленное (например, ожидание сетевой реакции или чтение многого из медленного хранилища) в потоке рендеринга: пользователь может приостановить работу в любое время и ожидать, что ваш поток рендеринга будет быстро выполнять действие паузы.