package org.wikipedia.concurrency; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import org.wikipedia.util.log.L; public class CallbackTask<T> extends SaneAsyncTask<T> { public interface Callback<T> { void success(T result); void failure(Throwable caught); } public interface Task<T> { T execute() throws Throwable; } @NonNull private final Task<T> task; @Nullable private Callback<T> callback; public static <T> void execute(@NonNull Task<T> task) { execute(task, null); } public static <T> void execute(@NonNull Task<T> task, @Nullable Callback<T> callback) { new CallbackTask<>(task, callback).execute(); } CallbackTask(@NonNull Task<T> task, @Nullable Callback<T> callback) { this.task = task; this.callback = callback; } @Override public T performTask() throws Throwable { return task.execute(); } @Override public void onFinish(T result) { super.onFinish(result); if (callback != null) { callback.success(result); callback = null; } } @Override public void onCatch(Throwable caught) { super.onCatch(caught); if (callback != null) { callback.failure(caught); callback = null; } } public static class DefaultCallback<T> implements Callback<T> { @Override public void success(T result) { } @Override public void failure(Throwable caught) { L.e(caught); } } }