Skip to content

Commit e1be6e2

Browse files
(fix):potential fix for multi scheduling of event work (#268)
* potential fix for multi scheduling of event work * add a comment why not restarting in event rescheduler
1 parent ec37c8a commit e1be6e2

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventRescheduler.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,11 @@ void reschedule(@NonNull Context context, @NonNull Intent broadcastIntent, @NonN
101101
// with wifi the service will be rescheduled on the interval.
102102
// Wifi connection state changes all the time and starting services is expensive
103103
// so it's important to only do this if we have stored events.
104-
ServiceScheduler.startService(context, EventIntentService.JOB_ID, eventServiceIntent);
105-
logger.info("Preemptively flushing events since wifi became available");
104+
// In android O and higher, we use a persistent job so we do not need to restart.
105+
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
106+
ServiceScheduler.startService(context, EventIntentService.JOB_ID, eventServiceIntent);
107+
logger.info("Preemptively flushing events since wifi became available");
108+
}
106109
}
107110
} else {
108111
logger.warn("Received unsupported broadcast action to event rescheduler");

shared/src/main/java/com/optimizely/ab/android/shared/ServiceScheduler.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import org.slf4j.Logger;
3434
import org.slf4j.LoggerFactory;
3535

36+
import java.util.stream.Collectors;
37+
3638
import static android.app.job.JobScheduler.RESULT_SUCCESS;
3739

3840
/**
@@ -273,6 +275,12 @@ public static void startService(Context context, Integer jobId, Intent intent) {
273275
.build();
274276
JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
275277

278+
if (jobScheduler.getAllPendingJobs().stream().filter(job -> job.getId() == jobId && job.getExtras().equals(intent.getExtras())).count() > 0) {
279+
// already pending job. don't run again
280+
LoggerFactory.getLogger("ServiceScheduler").info("Job already pending");
281+
return;
282+
}
283+
276284
JobWorkItem jobWorkItem = new JobWorkItem(intent);
277285
try {
278286
jobScheduler.enqueue(jobInfo, jobWorkItem);

0 commit comments

Comments
 (0)