aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKoushik Dutta <koushd@gmail.com>2013-05-20 22:41:12 -0700
committerKoushik Dutta <koushd@gmail.com>2013-05-20 22:41:12 -0700
commit358a1ba71fdee8668c25b697cd263407496339c5 (patch)
tree5970335313a8194edce2739975c489f045071817
parentb5533915b107ef669c782ff7b485fdf70fec75c6 (diff)
downloadAndroidAsync-358a1ba71fdee8668c25b697cd263407496339c5.tar.gz
AndroidAsync-358a1ba71fdee8668c25b697cd263407496339c5.tar.bz2
AndroidAsync-358a1ba71fdee8668c25b697cd263407496339c5.zip
Add support and tests for completion callback events on Futures.
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/future/Future.java4
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/future/FutureCallback.java8
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/future/SimpleFuture.java10
-rw-r--r--AndroidAsyncTest/src/com/koushikdutta/async/test/FutureTests.java39
4 files changed, 41 insertions, 20 deletions
diff --git a/AndroidAsync/src/com/koushikdutta/async/future/Future.java b/AndroidAsync/src/com/koushikdutta/async/future/Future.java
index a3afdb2..f1108ea 100644
--- a/AndroidAsync/src/com/koushikdutta/async/future/Future.java
+++ b/AndroidAsync/src/com/koushikdutta/async/future/Future.java
@@ -4,6 +4,6 @@ package com.koushikdutta.async.future;
import com.koushikdutta.async.callback.ResultCallback;
public interface Future<T> extends Cancellable, java.util.concurrent.Future<T> {
- public ResultCallback<T> getResultCallback();
- public void setResultCallback(ResultCallback<T> callback);
+ public FutureCallback<T> getResultCallback();
+ public void setResultCallback(FutureCallback<T> callback);
}
diff --git a/AndroidAsync/src/com/koushikdutta/async/future/FutureCallback.java b/AndroidAsync/src/com/koushikdutta/async/future/FutureCallback.java
new file mode 100644
index 0000000..b1fe530
--- /dev/null
+++ b/AndroidAsync/src/com/koushikdutta/async/future/FutureCallback.java
@@ -0,0 +1,8 @@
+package com.koushikdutta.async.future;
+
+/**
+ * Created by koush on 5/20/13.
+ */
+public interface FutureCallback<T> {
+ public void onCompleted(Exception e, T result);
+}
diff --git a/AndroidAsync/src/com/koushikdutta/async/future/SimpleFuture.java b/AndroidAsync/src/com/koushikdutta/async/future/SimpleFuture.java
index 14e5a62..a315fe0 100644
--- a/AndroidAsync/src/com/koushikdutta/async/future/SimpleFuture.java
+++ b/AndroidAsync/src/com/koushikdutta/async/future/SimpleFuture.java
@@ -72,7 +72,7 @@ public class SimpleFuture<T> extends SimpleCancelable implements DependentFuture
Exception exception;
public boolean setComplete(Exception e) {
- ResultCallback<T> callback;
+ FutureCallback<T> callback;
synchronized (this) {
if (!super.setComplete())
return false;
@@ -88,7 +88,7 @@ public class SimpleFuture<T> extends SimpleCancelable implements DependentFuture
T result;
public boolean setComplete(T value) {
- ResultCallback<T> callback;
+ FutureCallback<T> callback;
synchronized (this) {
if (!super.setComplete())
return false;
@@ -107,14 +107,14 @@ public class SimpleFuture<T> extends SimpleCancelable implements DependentFuture
return true;
}
- ResultCallback<T> callback;
+ FutureCallback<T> callback;
@Override
- public ResultCallback<T> getResultCallback() {
+ public FutureCallback<T> getResultCallback() {
return callback;
}
@Override
- public void setResultCallback(ResultCallback<T> callback) {
+ public void setResultCallback(FutureCallback<T> callback) {
// callback can only be changed or read/used inside a sync block
boolean runCallback;
synchronized (this) {
diff --git a/AndroidAsyncTest/src/com/koushikdutta/async/test/FutureTests.java b/AndroidAsyncTest/src/com/koushikdutta/async/test/FutureTests.java
index 4c886d6..70783f1 100644
--- a/AndroidAsyncTest/src/com/koushikdutta/async/test/FutureTests.java
+++ b/AndroidAsyncTest/src/com/koushikdutta/async/test/FutureTests.java
@@ -1,22 +1,17 @@
package com.koushikdutta.async.test;
-import java.util.ArrayList;
-import java.util.concurrent.CancellationException;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-import com.koushikdutta.async.callback.ResultCallback;
-import junit.framework.TestCase;
import android.os.Handler;
import android.os.Looper;
-
import com.koushikdutta.async.AsyncServer;
import com.koushikdutta.async.callback.CompletedCallback;
import com.koushikdutta.async.callback.ContinuationCallback;
import com.koushikdutta.async.future.Continuation;
+import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.async.future.SimpleFuture;
+import junit.framework.TestCase;
+
+import java.util.ArrayList;
+import java.util.concurrent.*;
public class FutureTests extends TestCase {
private static class IntegerFuture extends SimpleFuture<Integer> {
@@ -44,17 +39,35 @@ public class FutureTests extends TestCase {
public void testFutureCallback() throws Exception {
final Semaphore semaphore = new Semaphore(0);
- final IntegerFuture future = IntegerFuture.create(20, 2000);
- future.setResultCallback(new ResultCallback<Integer>() {
+ final IntegerFuture future = IntegerFuture.create(20, 1000);
+ final Thread mainThread = Thread.currentThread();
+ future.setResultCallback(new FutureCallback<Integer>() {
@Override
public void onCompleted(Exception e, Integer result) {
+ assertNotSame(Thread.currentThread(), mainThread);
semaphore.release();
}
});
assertTrue(semaphore.tryAcquire(3000, TimeUnit.MILLISECONDS));
}
-
+
+ public void testFutureFinishedCallback() throws Exception {
+ final Semaphore semaphore = new Semaphore(0);
+ final IntegerFuture future = IntegerFuture.create(20, 1);
+ Thread.sleep(1000);
+ final Thread mainThread = Thread.currentThread();
+ future.setResultCallback(new FutureCallback<Integer>() {
+ @Override
+ public void onCompleted(Exception e, Integer result) {
+ assertEquals(Thread.currentThread(), mainThread);
+ semaphore.release();
+ }
+ });
+
+ assertTrue(semaphore.tryAcquire(3000, TimeUnit.MILLISECONDS));
+ }
+
public void testFutureCancel() throws Exception {
// test a future being cancelled while waiting
final IntegerFuture future = IntegerFuture.create(20, 2000);