Здесь:
http://developer.android.com/guide/practices/design/responsiveness.html
ANR - это когда основной поток блокирует что-либо, поэтому рекомендуется всегда выполнять эту операцию в дочернем потоке:
ЦИТАТА:
Поэтому любой метод, который работает в
основной поток должен делать как можно меньше работы
насколько это возможно. В частности, Деятельность
следует сделать как можно меньше, чтобы установить
в ключевых методах жизненного цикла, таких как
onCreate () и onResume (). Потенциально
долгосрочные операции, такие как
операции с сетью или базой данных, или
вычислительно дорогие вычисления
такие как изменение размера растровых изображений должны быть
сделано в дочерней ветке (или в случае
операций с базами данных, через
асинхронный запрос). Тем не менее, это
не значит что твой основной поток
следует заблокировать во время ожидания
дочерняя нить для завершения - не должна
Вы вызываете Thread.wait () или
Thread.sleep (). Вместо блокировки
в ожидании дочерней нити
завершить, ваш основной поток должен
предоставить обработчик для дочерних потоков
отправить обратно по завершении.
Разработка вашего приложения таким образом
позволит вашей основной теме остаться
реагировать на ввод и, таким образом, избегать ANR
диалоги, вызванные 5-секундным вводом
Тайм-аут события. Эти же практики
следует соблюдать для любого другого
потоки, которые отображают пользовательский интерфейс, как они есть
также подвержены тем же тайм-аутам.
Я понимаю, что это нелегко, но рекомендация сверху состоит в том, что пользовательский интерфейс должен выполняться не в основном потоке.
С другой стороны, ваш основной поток находится в состоянии «WAIT», что означает использование не асинхронной операции. Возможно, вы хотите попробовать асинхронную опцию, которая должна привести к состоянию TIMED_WAIT, как показано ниже:
Android - как исследовать ANR?
(основной поток в порядке).
Но, как обсуждалось здесь:
http://groups.google.com/group/android-ndk/browse_thread/thread/84d6a9be21f4e579/b83537161b96da82?q=%22Bitmap+creation+and+composition+in+native+code%22#b83537161b96da82
Ваша проблема, которую я подозреваю, состоит в том, что рисование растрового изображения занимает слишком много времени между lockCanvas () и unlockCanvas () - возможно, вы захотите разбить обновление растрового изображения на более мелкие части? И в том же обсуждении также упоминается использование JNI / NDK для вычисления растровых изображений - что не следует делать внутри метода обновления растровых изображений на основе Java - если для выполнения вычислений требуется слишком много времени.
Рекомендуем прочитать:
http://obviam.net/index.php/the-android-game-loop/
Спасибо.