2010-07-02 3 views
2

Я ищу для создания событий, которые запускают изменения пользовательского интерфейса (например, Toast) на Android. Я уже знаю, что вы можете сделать это с помощью метода Handler объекта postDelayed(runnable, timeDelay) (see this page for a great example).Android - Временные пользовательские интерфейсы (с паузой/возобновлением)

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

Один из подходов, который приходил в голову, заключался в создании объекта Handler на новом Thread (а не на потоке пользовательского интерфейса) и очереди моих событий с использованием postDelayed; то я должен приостановить или возобновить выполнение всего Thread с использованием this method при необходимости. Основная проблема здесь заключается в том, чтобы выяснить, как сделать события запущены в потоке пользовательского интерфейса после их запуска.

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

Если у кого-то есть мысли по этому поводу или решения, это было бы здорово!

+0

Я только что попробовал новую тему с обработчиком, и это дало мне ошибку «Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare()». Таким образом, похоже, что этот подход выходит из окна. – idolize

+0

Вы назвали Looper.prepare()? http://developer.android.com/reference/android/os/Looper.html – mbafford

ответ

2

Если все события должны быть приостановлены такое же количество времени, вы можете отслеживать, сколько пауза времени накоплено и на handleMessage, ре-пост с использованием другого postDelayed с этого времени задержки ,

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

Вы могли бы объединить свою идею (очередь событий с желаемым временем начала). Обновите это время начала, когда закончится пауза. Используйте одно событие, которое является «processQueue», - установите его только при срабатывании, когда вы думаете, что следующее событие должно произойти. Если время, в течение которого произойдет следующее событие, задерживается из-за паузы, вы можете удалить событие processQueue и повторно опубликовать его.

+0

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

1
  1. Чтобы иметь возможность использовать обработчик с вашей собственной нитью вам нужно иметь петлителя см this для примера
  2. Чтобы иметь возможность запускать команду в UI Thread вы можете передать ссылку Handler внутри вашей собственной нити чтобы отправлять сообщения на него.
    Надеюсь, что это помогает
+0

Спасибо! Раньше я не изучал класс Looper, но похоже, что это было бы возможным решением. – idolize

0

Handler#removeCallbacks позволит вам разгладить опубликованное Runnable. Вы можете опубликовать его позже, когда узнаете новое время, в которое оно должно работать.

+0

Да, но я должен был бы знать, сколько времени осталось на исходном runnable, чтобы знать, что его повторно отправить. На самом деле это не слишком увлекало бы идею «огонь и забыть». – idolize