package com.gh4a; import android.content.Context; import android.os.AsyncTask; import android.support.v4.os.AsyncTaskCompat; public abstract class BackgroundTask<T> extends AsyncTask<Void, Void, T> { private final Context mContext; private Exception mException; public BackgroundTask(Context context) { mContext = context; } protected Context getContext() { return mContext; } public void schedule() { AsyncTaskCompat.executeParallel(this); } @Override protected T doInBackground(Void... params) { try { return run(); } catch (Exception e) { e.printStackTrace(); mException = e; } return null; } @Override protected void onPostExecute(T result) { super.onPostExecute(result); if (mException != null) { onError(mException); } else { onSuccess(result); } } protected abstract T run() throws Exception; protected abstract void onSuccess(T result); protected void onError(Exception e) { } }