Активность не отвечает половину времени, когда он запущен - PullRequest
0 голосов
/ 03 сентября 2011

Что-то странное здесь: моя активность в половине случаев, когда она запускается, зависает, и я получаю ARN из системы.

Некоторое время назад я написал простую игру с расширением AndEngine + PhysicsBox2d, без каких-либо проблем с ANR. Последние несколько дней я потратил на рефакторинг кода, введя пару классов для обработки начальной конфигурации и перемещения кода для улучшения согласованности. В идеале никаких изменений в поведении не было. однако теперь, если я открою приложение и закрою его как обычно, во второй раз, когда я его открою, приложение остановится и получит принудительное закрытие на время ожидания. Вот вывод из журнала:

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 кажется еще живым. Это нормальное поведение?

Ответы [ 3 ]

1 голос
/ 03 сентября 2011

Вы можете посмотреть /data/anr/traces.txt и обратиться к трассировке стека основного потока.(при условии, что этот файл не был перезаписан новыми ANR).

0 голосов
/ 03 сентября 2011

Помните, что означает ANR: Вы блокируете основной / UI-поток на определенное время (5 с, см. Что запускает ANR? ), поэтому входные события не могут быть обработаны правильно.

Итак, вы, вероятно, выполняете некоторую тяжелую работу в этом потоке, возможно, выполняемую из onResume() или onRestart().Начните искать эти дорогостоящие операции и убедитесь, что вы выполняете их в отдельном потоке (например, через AsyncTasks).Если вы не уверены, какая дорогая операция в вашем приложении, рассмотрите возможность измерения с traceview.См. этот пост в блоге разработчиков Android для хорошего представления.

0 голосов
/ 03 сентября 2011

Что вы делаете с методом onCreate? Похоже, вы делаете тяжелые вещи, которые должны обрабатываться в другом потоке.

Не видя код, было бы крайне сложно указать вам на проблему ... Так что мое лучшее предложение на данный момент - запустить поток для тяжелых задач. Рассмотрите возможность отображения заставки / диалогового окна Progress до завершения потока (для этого можно использовать AsyncTask)

...