Runnable вызывается непрерывно в миллисекундах, когда я устанавливаю время postDelayed более чем на 25 дней - PullRequest
0 голосов
/ 22 марта 2019

Runnable вызывается непрерывно в миллисекундах, когда я устанавливаю интервал postDelayed более чем на 25 дней.Он не вызывает runnable через 25 дней, но вызывается через каждые 10 миллисекунд, из-за которых происходит сбой приложения.Я делаю сетевую операцию в этом runnable.Есть ли максимальный лимит для времени задержки после публикации?

mHandler.postDelayed(runnable, 600 * 60 * 60 * 1000);

1 Ответ

2 голосов
/ 22 марта 2019

Ваша математика в 32-битных целых числах со знаком, и переполнение.

600 * 60 * 60 * 1000 - это 0x80befc00, которое является отрицательным целым числом и остается отрицательным при повышении до long. Вызов postDelayed() с отрицательной задержкой означает «немедленно», что при настройках по умолчанию Handler означает следующий vsync (каждые 16 мс с частотой обновления 60 Гц).

Чтобы исправить математику, измените один из операндов на long для работы с 64-битными целыми числами, например 600 * 60 * 60 * 1000L.

В любом случае, Handler#postDelayed() не очень подходит для таких длительных задач. Рассмотрим, например, WorkManager вместо.

...