Как синхронизировать обработчики Android с разными интервалами? - PullRequest
0 голосов
/ 18 января 2019

У меня в Android работает два обработчика Service.

  • handler1 запускается каждые 30 секунд
  • handler2 запускается каждые 5 секунд

Проблема в том, что handler2 не может работать одновременно с handler1.

Я имею в виду, когда handler2 достигает 30, 60, 90 ... секунд, он будет работать одновременно с handler1.

Итак, мне нужно в течение этих 30, 60 и 90 секунд найти способ запускать один обработчик за другим.

Я знаю, что решение для этого может быть, но оно не элегантное и не точное:

  • Пробег handler1 в секунду 0
  • Подождите 7 секунд (или любые другие x # секунд, не кратные 5)

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Поскольку handler2 выполняется чаще, чем handler1, вы можете использовать счетчик в handler2 для отслеживания того, когда следует запускать события, которые вы планируете инициировать в handler1.

handler2.postDelayed(new Runnable() {
    int count = 0;
    @Override
    public void run() {
        if (count == 0) {
            // fire handler1 events
        }
        count = (count+1) % 6;
    }
}, 5);
0 голосов
/ 20 января 2019

Как насчет использования TimerTask и Таймер для планирования повторного выполнения (каждые 5 секунд)? В зависимости от интервала вы выполняете либо задание, выполненное в данный момент в handler1, либо задание в handler2, либо и то, и другое. Возможно, вы можете разбить эти задания на функции, которые вызываются из метода TimerTask's run. Это позволило бы заданию handler1 выполняться до задания handler2 синхронизированным образом в том же потоке.

0 голосов
/ 18 января 2019

Чтобы убедиться, что handler1 всегда работает до handler2 , вы можете использовать следующий подход:

Каждый раз, когда handler1 завершает то, что должен делать, он [запускает сигнал на Service, в котором оба Handler s работают] запускает handler2 немедленно.

handler2 (или Service) будет разрешено запланировать повторное выполнение Runnable на следующие пять раундов. Вы можете использовать некоторый тип обратного отсчета, чтобы отслеживать оставшиеся раунды. Последний «независимо управляемый» раунд начнется примерно через 25 секунд после начального раунда. После этого раунда до handler1 можно выполнить следующую команду запуска для handler2 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...