Make ExecutableRunnable usable
authorMarius Gavrilescu <marius@ieval.ro>
Sat, 23 Mar 2013 11:54:39 +0000 (13:54 +0200)
committerMarius Gavrilescu <marius@ieval.ro>
Sat, 23 Mar 2013 11:54:39 +0000 (13:54 +0200)
First of all, the retry mechanism did not work at all until now (if a task was retried ExecutableRunnable would stack overflow).

Secondly, ExecutableRunnable now prevents retryTasks from being called too frequently. If it detects that retryTasks was called twice in 30 seconds, it reschedules the call 30 seconds later.

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.011906 seconds and 4 git commands to generate.