package droidkit.concurrent;
import android.os.Handler;
import android.support.annotation.NonNull;
import java.util.concurrent.Callable;
import java.util.concurrent.RunnableFuture;
import java.util.concurrent.TimeUnit;
/**
* @author Daniel Serdyukov
*/
class MainFuture<V> implements RunnableFuture<V> {
private static final int NEW = 0;
private static final int COMPLETING = 1;
private static final int EXCEPTIONAL = 2;
private static final int CANCELLED = 3;
private final Handler mHandler;
private final Runnable mRunnableTask;
private final Callable<V> mCallableTask;
private volatile int mState;
public MainFuture(@NonNull Handler handler, @NonNull Runnable task) {
mHandler = handler;
mRunnableTask = task;
mCallableTask = null;
mState = NEW;
}
public MainFuture(@NonNull Handler handler, @NonNull Callable<V> task) {
mHandler = handler;
mRunnableTask = null;
mCallableTask = task;
mState = NEW;
}
@Override
public boolean cancel(boolean mayInterruptIfRunning) {
mHandler.removeCallbacks(this);
mState = CANCELLED;
return true;
}
@Override
public boolean isCancelled() {
return mState >= CANCELLED;
}
@Override
public boolean isDone() {
return mState != NEW;
}
@Override
public V get() throws ConcurrentException {
throw new UnsupportedOperationException("MainQueue does not support getting the result");
}
@Override
public V get(long timeout, @NonNull TimeUnit unit) throws ConcurrentException {
throw new UnsupportedOperationException("MainQueue does not support getting the result");
}
@Override
public void run() {
if (mRunnableTask != null) {
mRunnableTask.run();
mState = COMPLETING;
} else {
try {
mCallableTask.call();
mState = COMPLETING;
} catch (Exception e) {
mState = EXCEPTIONAL;
}
}
}
}