Анимация Android, вызывающая тайм-аут простоя Activity для записи истории при запуске

Я искал ответ на этот вопрос, и хотя я могу найти других, которые видели те же записи в журнале cat, ни один из следов не похож на мой.

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

08-17 16:03:25.910: ПРЕДУПРЕЖДЕНИЕ/ActivityManager(110): время ожидания запуска истекло, отказ от блокировки пробуждения! 08–17 16:03:25.972: WARN/ActivityManager(110): тайм-аут простоя активности для HistoryRecord{4057ad58 com.companyname.dm/.ui.activities.home.HomeActivity}

Я читал сообщения, в которых говорится, что эти записи действительно являются просто предупреждениями, указывающими на то, что основной цикл обработки нити никогда не простаивал, и это не проблема, если это предполагаемый режим работы. Однако, помимо того факта, что небольшая повторяющаяся анимация (масштабирование/преобразование/альфа-анимация, которая повторяется каждые 3 секунды) заполняет очередь сообщений, моя главная проблема заключается в том, что она мешает возможности создавать автоматические тесты. Мы пытаемся реализовать тест с помощью robotium, но тест никогда не запускается из-за тайм-аута простоя.

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

Любое понимание будет с благодарностью! Спасибо.


person Gregg Rivinius    schedule 16.08.2011    source источник
comment
Я также нашел ветку на robotium group, которая относится к той же проблеме, но не имеет решения. В настоящее время мы изменили бесконечный повтор анимации на однократную анимацию, но, как я упоминал в своем исходном посте, это скорее обходной путь.   -  person Gregg Rivinius    schedule 18.08.2011
comment
Я предполагаю, что мой вопрос действительно сводится к тому, есть ли чистый способ реализовать анимацию, чтобы она не постоянно заполняла цикл сообщений основного потока пользовательского интерфейса? Например, снизить частоту кадров или перенести что-либо во вторичный поток? Если бы основной пользовательский интерфейс бездействовал даже в течение короткого периода времени, то вызов waitForIdleSync() не стал бы проблемой.   -  person Gregg Rivinius    schedule 18.08.2011
comment
когда ты запускаешь эти анимации?   -  person Ronnie    schedule 22.08.2011
comment
Когда анимация запускается, не имеет большого значения... если она запускается как часть запуска, то у нас возникают проблемы с неуспешным вызовом getActivity waitForIdleSync. Отсрочка запуска анимации до более позднего момента лишь отсрочит эту проблему до более позднего момента в жизни тестов Robotium. В настоящее время первая анимация начинается после того, как активность привязана к фоновой службе и получает обновление статуса от этой службы (это происходит после onResume), что достаточно рано для сбоя getAcitivity и создания сообщения logcat тайм-аута запуска.   -  person Gregg Rivinius    schedule 23.08.2011
comment
Вы нашли какое-то решение этой проблемы? Кажется, у меня такая же проблема. Мой getActivity() внутри моих тестов не возвращается, потому что он ждет, пока активность не станет бездействующей. Этого никогда не происходит, потому что внутри моей активности есть ViewPager, который выполняет бесконечный цикл по изображениям. Кроме того, я вижу тот же вывод журнала, что и вы (тайм-аут простоя). Было бы здорово услышать, что вы решили эту проблему :-) С уважением, Дэвид   -  person david.schreiber    schedule 12.11.2013
comment
Возможно, связано с 20860832 и 20151699.   -  person Gary Sheppard    schedule 01.01.2014


Ответы (2)


Попробуйте запустить анимацию в новом потоке, если вы сделаете слишком много вещей в методе onCreate, вы заблокируете поток пользовательского интерфейса в Android, и это может привести к ANR (приложение не отвечает), если вы потратите больше 5 секунд. возвращение. Запустив анимацию в новом потоке, onCreate вернется, и система будет счастлива.

new Thread(new Runnable() {
  public void run() {
    //start animation.
  }
}.start();
person dac2009    schedule 24.08.2011
comment
Это не помогает ... У меня нет проблем с тем, чтобы делать слишком много в onCreate, я не приближаюсь к созданию ANR. Мое приложение запускается быстро и отзывчиво. Проблема в том, что анимация (как я и ожидал) постоянно перерисовывает экран, и именно эти сообщения рисования удерживают основной поток пользовательского интерфейса до такой степени, что он никогда не считается бездействующим. - person Gregg Rivinius; 24.08.2011

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

У вас могут возникнуть проблемы при взаимодействии с пользовательским интерфейсом из другого потока, для этого вам следует изучить AsyncTask, который на самом деле используется для вычисления/отрисовки индикаторов выполнения. Непристойное количество предупреждений, скорее всего, связано с тем, что предупреждения генерируются в любое время после X секунд, что ограничено только проверками Android.

person Dororo    schedule 25.08.2011
comment
Чем это отличается от более раннего ответа dac2009 ... Я считаю, что даже если анимация запускается в другом потоке (что я и сделал), фактически сообщения о перерисовке экрана обрабатываются в основном потоке пользовательского интерфейса. Перемещение анимации в фоновый поток не решило проблему. - person Gregg Rivinius; 25.08.2011