Fluent class for AsyncTask
June 6, 2014 ยท View on GitHub
package me.champeau.gr8confagenda.app;
import android.os.AsyncTask;
import groovy.lang.Closure;
/**
-
An implementation of {@link android.os.AsyncTask} which makes it easy to deal with
-
requests/callbacks using Groovy closures */ public class Fluent<Result, Progress> extends AsyncTask<Void, Progress, Result> { private final Closure
request; private final ResultConsumer then; private final Closure progress; private Fluent(Closure
request, ResultConsumer then, Closure progress) { this.request = request; this.then = then; this.progress = progress; } @Override protected Result doInBackground(Void... params) { return request.call(); }
@Override protected void onPostExecute(Result result) { then.consume(result); }
@Override protected void onProgressUpdate(Progress... values) { if (progress!=null) { progress.call(values); } }
public static interface ResultConsumer
{ void consume(T result); } public static class FluentAsyncTaskBuilder<Result,Progress> { Closure
request; Closure progress; private FluentAsyncTaskBuilder<Result,Progress> from(Closure<Result> request) { this.request = request; return this; } FluentAsyncTaskBuilder<Result,?> onProgress(Closure progress) { this.progress = progress; return this; } void then(ResultConsumer<Result> then) { Fluent<Result,Progress> resultFluent = new Fluent<Result,Progress>(request, then, progress); resultFluent.execute(); }}
public static <Result,Progress> FluentAsyncTaskBuilder<Result,Progress> async(Closure
request) { return new FluentAsyncTaskBuilder<Result,Progress>().from(request); } }