/** * Only valid if the job isn't periodic. * * @return The back-off policy if a job failed and is rescheduled. * @see JobRequest#getBackoffPolicy() */ public JobRequest.BackoffPolicy getBackoffPolicy() { return mRequest.getBackoffPolicy(); }
/*package*/ long getBackoffOffset() { if (isPeriodic()) { return 0L; } long offset; switch (getBackoffPolicy()) { case LINEAR: offset = mFailureCount * getBackoffMs(); break; case EXPONENTIAL: if (mFailureCount == 0) { offset = 0L; } else { offset = (long) (getBackoffMs() * Math.pow(2, mFailureCount - 1)); } break; default: throw new IllegalStateException("not implemented"); } return Math.min(offset, TimeUnit.HOURS.toMillis(5)); // use max of 5 hours like JobScheduler }
@Test public void testPeriodic() { long interval = JobRequest.MIN_INTERVAL * 5; JobRequest request = getBuilder() .setPeriodic(interval) .setExtras(new PersistableBundleCompat()) .build(); assertThat(request.getJobId()).isGreaterThan(0); assertThat(request.getTag()).isEqualTo(DummyJobs.SuccessJob.TAG); assertThat(request.getIntervalMs()).isEqualTo(interval); assertThat(request.getFlexMs()).isEqualTo(interval); assertThat(request.isPeriodic()).isTrue(); assertThat(request.isFlexSupport()).isFalse(); assertThat(request.getStartMs()).isNegative(); assertThat(request.getEndMs()).isNegative(); assertThat(request.getBackoffMs()).isEqualTo(JobRequest.DEFAULT_BACKOFF_MS); assertThat(request.getBackoffPolicy()).isEqualTo(JobRequest.DEFAULT_BACKOFF_POLICY); assertThat(request.getExtras()).isNotNull(); assertThat(request.isExact()).isFalse(); assertThat(request.requiredNetworkType()).isEqualTo(JobRequest.DEFAULT_NETWORK_TYPE); assertThat(request.requirementsEnforced()).isFalse(); assertThat(request.requiresCharging()).isFalse(); assertThat(request.requiresDeviceIdle()).isFalse(); }
/** * Only valid if the job isn't periodic. * * @return The back-off policy if a job failed and is rescheduled. * @see JobRequest#getBackoffPolicy() */ public JobRequest.BackoffPolicy getBackoffPolicy() { return mRequest.getBackoffPolicy(); }
/*package*/ long getBackoffOffset() { if (isPeriodic()) { return 0L; } long offset; switch (getBackoffPolicy()) { case LINEAR: offset = mFailureCount * getBackoffMs(); break; case EXPONENTIAL: if (mFailureCount == 0) { offset = 0L; } else { offset = (long) (getBackoffMs() * Math.pow(2, mFailureCount - 1)); } break; default: throw new IllegalStateException("not implemented"); } return Math.min(offset, TimeUnit.HOURS.toMillis(5)); // use max of 5 hours like JobScheduler }
@Test public void testAdapter() throws InterruptedException, IOException { FilePayload payload = buildPayload(); int tenMinutes = 10 * 60 * 1000; UploadRequest<FilePayload> request = buildUploadRequest(payload, tenMinutes); JobRequest adapted = AndroidJobStrategy.adapt(request); assertEquals(20, adapted.getStartMs()); assertEquals(tenMinutes, adapted.getEndMs()); assertEquals(true, adapted.requiresCharging()); assertEquals(false, adapted.requiresDeviceIdle()); assertEquals(100, adapted.getBackoffMs()); assertEquals(JobRequest.BackoffPolicy.LINEAR, adapted.getBackoffPolicy()); assertEquals(9, adapted.getExtras().get("maxErrorRetries")); } }