import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.FutureTask; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; /** * This class acts as a proxy to the existing Future object * * @author boxcat */ public class FutureManager { private final ScheduledExecutorService srv = Executors .newScheduledThreadPool(3); private FutureTask<String> current = null; private final static String ALREADY_CANCELLED = "Cancelled"; private final FutureController controller; FutureManager(FutureController controller) { this.controller = controller; } public boolean cancel(boolean mayInterruptIfRunning) { controller.hideSpinner(); return current.cancel(mayInterruptIfRunning); } public boolean isCancelled() { return current.isCancelled(); } public boolean isDone() { return current.isDone(); } public String get() throws InterruptedException, ExecutionException { if (current.isCancelled()) return ALREADY_CANCELLED; return current.get(); } public String get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { return current.get(timeout, unit); } /** * Creates a new Future object and sets it running on the threadpool * * @param waitTime * @param message */ public synchronized void createFuture(final int waitTime, final String message) { if (current != null) current.cancel(true); current = new FutureTask<String>(new Callable<String>() { @Override public String call() throws Exception { controller.showSpinner(); Thread.sleep(waitTime * 1000); controller.hideSpinner(); return message; } }); srv.schedule(current, 500, TimeUnit.MILLISECONDS); } }