Make ExecutableRunnable usable
[fonbot.git] / src / ro / ieval / fonbot / ExecutableRunnable.java
index 642661b4ccd4ac40a20e83dfb1964fdf425257be..13addac0a5a9e7bd238fcecc68189591f396b67f 100644 (file)
@@ -2,8 +2,11 @@ package ro.ieval.fonbot;
 
 import java.util.LinkedList;
 import java.util.Queue;
-import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import android.os.SystemClock;
 
 /*
  * Copyright © 2013 Marius Gavrilescu
@@ -38,17 +41,35 @@ import java.util.concurrent.Executors;
  */
 abstract class ExecutableRunnable implements Runnable {
        /** Executor used to execute instances of this class */
-       private static final Executor executor = Executors.newSingleThreadExecutor();
+       private static final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
        /** Queue containing <code>ExecutableRunnable</code>s that should be retried */
        private static final Queue<ExecutableRunnable> retryPendingTasks = new LinkedList<ExecutableRunnable>();
+       /** Minimum interval between task retries, in milliseconds */
+       private static final long retryInterval = 30000;
+       /** {@link SystemClock#elapsedRealtime()} time of last successful call to {@link #retryTasks()} */
+       private static long lastRetry = 0;
+       /** True if a retryTasks run is already scheduled on {@link #executor} */
+       private static volatile boolean retryIsScheduled = false;
 
        /** Run all tasks that should be retried */
        public static final void retryTasks(){
+               if(!retryIsScheduled && lastRetry+retryInterval>SystemClock.elapsedRealtime()){
+                       retryIsScheduled = true;
+                       executor.schedule(new Runnable() {
+                               @Override
+                               public void run() {
+                                       retryTasks();
+                                       retryIsScheduled = false;
+                               }
+                       }, retryInterval, TimeUnit.MILLISECONDS);
+                       return;
+               }
                synchronized(retryPendingTasks){
                        for(ExecutableRunnable task : retryPendingTasks)
-                               task.execute();
+                               executor.execute(task);
                        retryPendingTasks.clear();
                }
+               lastRetry=SystemClock.elapsedRealtime();
        }
 
        /** Execute this <code>ExecutableRunnable</code> */
This page took 0.010437 seconds and 4 git commands to generate.