Запуск обратного отсчета на нескольких подключенных устройствах одновременно - Firebase Android - PullRequest
0 голосов
/ 11 июля 2020

Я создаю приложение Android, в котором игроки подключены к базе данных Firebase Realtime (от 2 до 4 игроков в комнате). Если я резюмирую, что должен делать мой код: игроки могут нажимать кнопку каждый по очереди. Когда игрок щелкает и наступает его очередь, приложение записывает (с runTransaction) на сервере тип int (например, «clicked: 2» означает, что игрок 2 только что щелкнул). Когда "нажатая" клавиша видна на сервере (с addValueEventListener), все игроки, подключенные к этой комнате, выполняют (одновременно, и выполнение выполняется на стороне клиента) 3 секунды CountDownTimer. Во время этого обратного отсчета все игроки (без исключения) могут нажимать на свои кнопки, и в этом случае учитывается только тот, кто щелкнет первым (потому что runTransaction), и будет записан на сервере. Таким образом, каждый увидит на своем устройстве, что игрок щелкнул свою кнопку во время обратного отсчета, а затем мы начнем все сначала (то есть следующий игрок должен начать обратный отсчет et c). Теоретически это нормально, но после тестирования (со старым и новым, а значит и более быстрым, смартфоном) возникает проблема:

Некоторые устройства работают быстрее других, и в большинстве случаев обратный отсчет не начинается одновременно для разных игроков. Так что я подумал, например (но возможны и другие, не стесняйтесь!), Написать на сервере, в какое время (в мс) игрок щелкнул, и взять это время + 500 мс (или другое) чтобы начать обратный отсчет. Но для этого вам понадобится время Firebase (TimeStamp я думаю), и я не знаю, как ... (желательно только в Java, я не люблю трогать json слишком много)

1 Ответ

2 голосов
/ 11 июля 2020

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

Firebase оценивает эту задержку при первом подключении клиента и делает ее доступной в узле .info/serverTimeOffset на клиенте. . Вы можете использовать это значение для (частичной) корректировки задержки. Подробнее об этом и образце кода см. В документации по смещение часов .

...