Приложение Android вылетает при перезапуске - PullRequest
0 голосов
/ 20 января 2011

Я изначально задавал вопрос здесь:
http://www.experts -exchange.com / Программирование / Языки / Java / Android / Q_26754261.html
Но я думаю, что это может быть лучшее место, чтобы задать вопрос.

Я создал приложение для Android, которое вызывает некоторый нативный код. Когда я впервые запускаю приложение на устройстве Android 2.2 (нажатием на значок), оно работает нормально, но если я нажимаю кнопку «Назад», а затем повторно запускаю приложение, снова нажимая его значок, приложение вылетает (информация из eclipse):

 01-19 13:21:51.989: INFO/DEBUG(30): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
    01-19 13:21:51.989: INFO/DEBUG(30): Build fingerprint: 'generic/sdk/generic:2.3/GRH55/79397:eng/test-keys'
    01-19 13:21:51.989: INFO/DEBUG(30): pid: 354, tid: 381  >>> Test.Application <<<
    01-19 13:21:51.989: INFO/DEBUG(30): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0000005a

Я проверил нативный код и не вижу ошибок. Код также работает при первом запуске. Это как-то связано с тем, что при нажатии кнопки «назад» освобождаются не все ресурсы. Хотя я нашел простое решение проблемы, вставив System.exit (0) в onDestroy (), но это работает только тогда, когда приложение находится в ландшафтном режиме.

В ландшафтном режиме жизненный цикл выглядит следующим образом:

    01-15 22:38:29.913: INFO(18062): onCreate
    01-15 22:38:30.143: INFO(18062): onResume

Pressed back button

    01-15 22:38:34.093: INFO(18062): onPause
    01-15 22:38:34.343: INFO(18062): OnDestroy

В портретном режиме жизненный цикл выглядит следующим образом:

    01-15 22:41:00.343: INFO(18167): onCreate
    01-15 22:41:00.863: INFO(18167): onResume
    01-15 22:41:00.913: INFO(18167): onPause
    01-15 22:41:00.913: INFO(18167): OnDestroy
    01-15 22:41:01.423: INFO(18167): onCreate
    01-15 22:41:01.693: INFO(18167): onResume

Pressed back button

    01-15 22:41:05.663: INFO(18167): onPause
    01-15 22:41:05.963: INFO(18167): OnDestroy

Так что в портретном режиме все происходит дважды - поэтому, если я вставлю System.exit (0) в onDestroy, приложение не запустится, когда устройство находится в вертикальном / в портретном режиме.

Полагаю, лучшим решением было бы найти реальную причину сбоя нативного кода, но пока я не нашел причину. Может быть, это как-то связано с нехваткой памяти. Я попытался запустить Debug.getNativeHeapFreeSize (), и объем свободной памяти иногда очень мал, но в сообщении об ошибке говорится «адрес ошибки».

После сбоя приложения я нажимаю на его значок и снова запускаю приложение без проблем. Таким образом, приложение успешно запускается только в половине случаев, когда вы нажимаете его значок.

У вас есть идеи, что не так или, возможно, обходной путь? Я искал ответ на этом сайте и нашел некоторую информацию о проблеме двойного жизненного цикла и о том, как получить трассировку стека JNI. Я еще посмотрю и посмотрю, смогу ли я найти причину. Я также мог бы сделать некрасивый обходной путь, который гарантирует, что System.exit (0) не будет вызываться при первом вызове onDestroy, если устройство находится в портретном режиме, но если приложение затем установлено на устройстве, у которого нет этой двойной проблемы жизненного цикла приложение не будет корректно завершать работу в портретном режиме.

/ Kim

1 Ответ

0 голосов
/ 21 января 2011

Это произошло потому, что я забыл освободить память в коде C ++. Теперь он, наконец, больше не падает, и проблема двойного жизненного цикла больше не имеет значения.

...