diff options
Diffstat (limited to 'AndroidAsync/src/com/koushikdutta/async/Continuation.java')
-rw-r--r-- | AndroidAsync/src/com/koushikdutta/async/Continuation.java | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/AndroidAsync/src/com/koushikdutta/async/Continuation.java b/AndroidAsync/src/com/koushikdutta/async/Continuation.java new file mode 100644 index 0000000..e9b1719 --- /dev/null +++ b/AndroidAsync/src/com/koushikdutta/async/Continuation.java @@ -0,0 +1,54 @@ +package com.koushikdutta.async; + +import java.util.LinkedList; + +import junit.framework.Assert; + +import com.koushikdutta.async.callback.CompletedCallback; +import com.koushikdutta.async.callback.ContinuationCallback; + +public class Continuation { + CompletedCallback callback; + CompletedCallback wrapper; + public Continuation(CompletedCallback callback) { + this.callback = callback; + wrapper = new CompletedCallback() { + @Override + public void onCompleted(Exception ex) { + if (ex == null) { + next(); + return; + } + Continuation.this.callback.onCompleted(ex); + } + }; + } + + LinkedList<ContinuationCallback> mCallbacks = new LinkedList<ContinuationCallback>(); + + public void add(ContinuationCallback callback) { + mCallbacks.add(callback); + } + + private void next() { + if (mCallbacks.size() > 0) { + ContinuationCallback cb = mCallbacks.remove(); + try { + cb.onContinue(wrapper); + } + catch (Exception e) { + callback.onCompleted(e); + } + return; + } + + callback.onCompleted(null); + } + + boolean started; + public void start() { + Assert.assertTrue(!started); + started = true; + next(); + } +} |