С чего начать отладку, когда вы получаете «Активность не отвечает, принудительное закрытие, ожидание»? - PullRequest
2 голосов
/ 23 января 2011

Я работал над простым приложением. Это приложение включает в себя различные уровни, которые можно решить, поместив некоторые компоненты внутри холста, перетащив их в нужное место и т. Д.

Приложение работает нормально, но при попытке его на моем HTC Desire 2.2 я иногда получаю предупреждение:

Извините: Деятельность ххххх не перекодируется. Force Close - Wait

Если я нажму кнопку ожидания и оставлю ее на несколько секунд (иногда до ~ 30 секунд), то она запустится без проблем. Я не знаю, с чего начать отладку кода, поскольку это происходит только время от времени.

Я прочитал материал на сайте разработчиков Google, и это были в основном очень общие вещи, которые не очень помогли.

есть идеи?

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

//Evrything else
Bitmap bitmap;
GraphicObject.Coordinates coords;
for (GraphicObject graphic : _graphics) {
    bitmap = graphic.getGraphic();
    coords = graphic.getCoordinates();
    canvas.drawBitmap(bitmap, coords.getX(), coords.getY(), null);
}
// draw current graphic at last...
if (_currentGraphic != null) {
    bitmap = _currentGraphic.getGraphic();
    coords = _currentGraphic.getCoordinates();
    canvas.drawBitmap(bitmap, coords.getX(), coords.getY(), null);
}

Ответы [ 4 ]

4 голосов
/ 23 января 2011

Android имеет относительно хорошую встроенную поддержку профилировщика. Когда вы знаете место, где появится этот ADNR (например, с помощью одного из методов вашей деятельности, вы можете поместить этот блок в блок трассировки:

Debug.startMethodTracing("xyz");
<your code goes here>
Debug.stopMethodTracing()

При активации будет записан файл трассировки в /sdcard/xyz.trace

. Позже (после такого ADNR) его можно получить с помощью

adb pull /sdcard/xyz.trace

и проанализировать с помощью

traceview xyz.trace

На экране трассировки вы видите метод с вызванными им методами, а затем можете увидеть время. См. http://developer.android.com/guide/developing/tools/adb.html и http://developer.android.com/guide/developing/tools/traceview.html

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

Вы можете использовать новый StrictMode, чтобы определить причину зависания вашего потока пользовательского интерфейса. Взгляните на эту ссылку .

Он доступен только для GingerBread (уровень API 9), поэтому вы можете просто протестировать его на эмуляторе, выполнить необходимую очистку, а затем удалить код StrictMode

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

Я думаю, что вы создаете 30-секундный спящий режим в главном потоке, если это так, приложение не будет отвечать на запросы в течение 30 секунд, и система Android покажет диалоговое окно принудительного закрытия, которое появится через 5 секунд.Попробуйте создать 30-секундную паузу и действие в новом потоке.Посетите сайт разработчиков Android для получения дополнительной информации о потоках.

А если вы не знаете, с чего начать отладку, проверьте журнал logcat и найдите ошибки или предупреждения.Проверьте это -> http://www.droidnova.com/debugging-in-android-using-eclipse,541.html для получения некоторой информации о logcat.

Надеюсь, что это помогло.:) Удачи.

Редактировать: Тогда я думаю, что вы должны поместить функции, которые кнопка ожидания выполняет, в новый поток, чтобы приложение мгновенно стало отзывчивым, а дочерний поток остался без ответа, что не имеет значения.

Снова отредактируйте: о, я понял, извините за недоразумение, поэтому вы не уверены, в чем проблема, попробуйте найти любые сетевые подключения, спящий режим / паузы в вашем коде.Да, и подключите телефон к компьютеру, запустите приложение, нажав клавишу F5, и попробуйте найти предупреждения или ошибки в logcat только тогда, когда откроется окно принудительного закрытия.И попробуйте скопировать журнал logcat и отправить его мне, и я проверим, что не так.

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

Вы делаете сетевые подключения в главном потоке? Или Time.sleep (). Или чрезвычайно длительные расчеты?

Что-то в главном потоке вашего приложения занимает более 5 (или 10?) Секунд.

...