diff options
3 files changed, 49 insertions, 17 deletions
diff --git a/AndroidAsync/src/com/koushikdutta/async/future/ConvertFuture.java b/AndroidAsync/src/com/koushikdutta/async/future/ConvertFuture.java new file mode 100644 index 0000000..b07ac43 --- /dev/null +++ b/AndroidAsync/src/com/koushikdutta/async/future/ConvertFuture.java @@ -0,0 +1,13 @@ +package com.koushikdutta.async.future; + +/** + * Created by koush on 6/21/14. + */ +public abstract class ConvertFuture<T, F> extends TransformFuture<T, F> { + @Override + protected final void transform(F result) throws Exception { + setComplete(convert(result)); + } + + protected abstract Future<T> convert(F result) throws Exception; +} diff --git a/AndroidAsync/src/com/koushikdutta/async/future/HandlerFuture.java b/AndroidAsync/src/com/koushikdutta/async/future/HandlerFuture.java index 81c1822..d03eaf9 100644 --- a/AndroidAsync/src/com/koushikdutta/async/future/HandlerFuture.java +++ b/AndroidAsync/src/com/koushikdutta/async/future/HandlerFuture.java @@ -1,31 +1,39 @@ package com.koushikdutta.async.future; import android.os.Handler; +import android.os.Looper; /** * Created by koush on 12/25/13. */ -public class HandlerFuture<T> extends TransformFuture<T, T> { - Handler handler = new Handler(); +public class HandlerFuture<T> extends SimpleFuture<T> { + Handler handler; - @Override - protected void error(final Exception e) { - handler.post(new Runnable() { - @Override - public void run() { - HandlerFuture.super.error(e); - } - }); + public HandlerFuture() { + Looper looper = Looper.myLooper(); + if (looper == null) + looper = Looper.getMainLooper(); + handler = new Handler(looper); } @Override - protected void transform(final T result) throws Exception { - handler.post(new Runnable() { + public SimpleFuture<T> setCallback(final FutureCallback<T> callback) { + FutureCallback<T> wrapped = new FutureCallback<T>() { @Override - public void run() { - if (!isCancelled()) - setComplete(result); + public void onCompleted(final Exception e, final T result) { + if (Looper.myLooper() == handler.getLooper()) { + callback.onCompleted(e, result); + return; + } + + handler.post(new Runnable() { + @Override + public void run() { + onCompleted(e, result); + } + }); } - }); + }; + return super.setCallback(wrapped); } } diff --git a/AndroidAsync/src/com/koushikdutta/async/future/SimpleFuture.java b/AndroidAsync/src/com/koushikdutta/async/future/SimpleFuture.java index dd33d54..11f5df3 100644 --- a/AndroidAsync/src/com/koushikdutta/async/future/SimpleFuture.java +++ b/AndroidAsync/src/com/koushikdutta/async/future/SimpleFuture.java @@ -14,6 +14,17 @@ public class SimpleFuture<T> extends SimpleCancellable implements DependentFutur boolean silent; FutureCallback<T> callback; + public SimpleFuture() { + } + + public SimpleFuture(T value) { + setComplete(value); + } + + public SimpleFuture(Exception e) { + setComplete(e); + } + @Override public boolean cancel(boolean mayInterruptIfRunning) { return cancel(); @@ -166,7 +177,7 @@ public class SimpleFuture<T> extends SimpleCancellable implements DependentFutur } @Override - public <C extends FutureCallback<T>> C then(C callback) { + public final <C extends FutureCallback<T>> C then(C callback) { if (callback instanceof DependentCancellable) ((DependentCancellable)callback).setParent(this); setCallback(callback); |