Я хочу запустить Worker
, который выполняет какую-то задачу, и в случае ошибки пытается снова после некоторой задержки с экспоненциальной стратегией отсрочки.
Вот упрощенно Worker
для краткости:
class TestWorker(
context: Context,
workerParameters: WorkerParameters
) : Worker(
context,
workerParameters
) {
override fun doWork(): Result {
Log.d("DEBUG", "Attempt $runAttemptCount")
return Result.retry()
}
}
И вот как я планирую это Worker
:
class MainActivity : AppCompatActivity() {
private val TAG = "WORKER_TAG"
private val BACKOFF_DELAY_SECONDS = 60L
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val workManager = WorkManager.getInstance()
workManager.cancelAllWork()
val workRequest = OneTimeWorkRequest.Builder(TestWorker::class.java)
.setConstraints(
Constraints
.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
)
.setBackoffCriteria(
BackoffPolicy.EXPONENTIAL,
BACKOFF_DELAY_SECONDS,
TimeUnit.SECONDS
)
.addTag(TAG)
.build()
workManager.enqueue(workRequest)
}
}
Отлично работает на большинстве устройств, однако я наблюдаю странное поведение на некоторых устройствах.
Я ожидаю, что попытка 2 будет выполнена через 1 минуту, но на Samsung J1, 6.0.1 я вижу следующий журнал:
01-15 12:39:57.438 28396-28435/test.ru.workerissue D/DEBUG: Attempt 0
01-15 12:39:58.349 28396-28439/test.ru.workerissue D/DEBUG: Attempt 1
01-15 12:39:58.389 28396-28440/test.ru.workerissue D/DEBUG: Attempt 2
01-15 12:40:59.669 28396-28435/test.ru.workerissue D/DEBUG: Attempt 3
01-15 12:40:59.719 28396-28439/test.ru.workerissue D/DEBUG: Attempt 4
Как видите, задержка между всеми попытками, кроме 2 и 3, составляет около 1 секунды.
Если я запускаю один и тот же код на Nexus 6X, 8.1, я наблюдаю две попытки при запуске одновременно, и тогда все работает как положено:
2019-01-15 13:01:06.610 28806-28841/test.ru.workerissue D/DEBUG: Attempt 0
2019-01-15 13:01:06.658 28806-28842/test.ru.workerissue D/DEBUG: Attempt 1
2019-01-15 13:02:06.747 28806-28975/test.ru.workerissue D/DEBUG: Attempt 2
2019-01-15 13:04:06.876 28806-29024/test.ru.workerissue D/DEBUG: Attempt 3
Кроме того, я протестировал это на нескольких других устройствах: Samsung Galaxy J3 - 8.0, Google Pixel XL - 8.1, Samsung Galaxy J1 - 5.1.1. Работает должным образом на всех этих устройствах.
Версия WorkManager
равна 1.0.0-beta01
В чем может быть причина такого несоответствия? Можно ли это исправить?