Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Gregg RiviniusОтветов: 2

Я искал ответ на этот вопрос, и хотя я могу найти других, которые видели те же записи в журнале 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, но тест никогда не запускается из-за тайм-аута простоя.

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

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

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

androidanimationtimeoutlaunch

Ответы

Ответ 1 · dac2009

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

new Thread(new Runnable() {
  public void run() {
    //start animation.
  }
}.start();

Ответ 2 · Dororo

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы