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); } }