Android - синхронизированные события пользовательского интерфейса (с паузой / возобновлением) - PullRequest
2 голосов
/ 02 июля 2010

Я хочу создать синхронизированные события, которые вызывают изменения пользовательского интерфейса (например, тост) на Android. Я уже знаю, что вы можете сделать это с помощью Handler объекта postDelayed(runnable, timeDelay) метода ( см. На этой странице отличный пример ).

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 03 июля 2010

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

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

1 голос
/ 03 июля 2010
  1. Чтобы иметь возможность использовать обработчик со своим собственным потоком, вам нужно иметь петлитель, см. this для примера
  2. Чтобы выполнить команду в потоке пользовательского интерфейса, вы можете передать ссылку на обработчик в свой собственный код потока, чтобы иметь возможность публиковать на него сообщения.
    Надеюсь, это поможет
0 голосов
/ 03 июля 2010

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

...