package com.quickblox.sample.core.async; import android.os.AsyncTask; import android.os.Handler; import android.os.Looper; import android.util.Log; public abstract class BaseAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> { private static final String TAG = BaseAsyncTask.class.getSimpleName(); private static final Handler mainThreadHandler = new Handler(Looper.getMainLooper()); private boolean isExceptionOccurred; @Override protected final Result doInBackground(Params... params) { try { return performInBackground(params); } catch (final Exception e) { isExceptionOccurred = true; mainThreadHandler.post(new Runnable() { @Override public void run() { onException(e); } }); return null; } } @Override protected final void onPostExecute(Result result) { if (!isExceptionOccurred) { onResult(result); } } public abstract Result performInBackground(Params... params) throws Exception; public abstract void onResult(Result result); public void onException(Exception e) { Log.w(TAG, e); } }