X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=src%2Fro%2Fieval%2Ffonbot%2FExecutableRunnable.java;h=13addac0a5a9e7bd238fcecc68189591f396b67f;hb=e154bdfd76071b99635317ef8c7ab11918b88794;hp=642661b4ccd4ac40a20e83dfb1964fdf425257be;hpb=d5819b37350dc3f123c817fad55cdbad0c9c1c95;p=fonbot.git diff --git a/src/ro/ieval/fonbot/ExecutableRunnable.java b/src/ro/ieval/fonbot/ExecutableRunnable.java index 642661b..13addac 100644 --- a/src/ro/ieval/fonbot/ExecutableRunnable.java +++ b/src/ro/ieval/fonbot/ExecutableRunnable.java @@ -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 ExecutableRunnables that should be retried */ private static final Queue retryPendingTasks = new LinkedList(); + /** 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 ExecutableRunnable */