/* * Copyright (c) 2005 - 2013, all rights reserved */ package com.mcxiaoke.apptoolkit.task; import android.os.AsyncTask; import android.os.Build; import android.util.Pair; public abstract class AsyncTaskBase<Params, Progress, Result> extends AsyncTask<Params, Progress, Pair<Result, Throwable>> { private AsyncTaskCallback<Progress, Result> mCallback; protected volatile boolean mCancelled; public AsyncTaskBase(AsyncTaskCallback<Progress, Result> callback) { this.mCallback = callback; this.mCancelled = false; } /** * 设置结果回调监听器 * * @param callback */ public void setCallback(AsyncTaskCallback<Progress, Result> callback) { this.mCallback = callback; } @Override protected void onProgressUpdate(Progress... values) { super.onProgressUpdate(values); if (mCallback != null) { mCallback.onTaskProgress(0, values[0]); } } @Override protected final Pair<Result, Throwable> doInBackground(Params... params) { Result res = null; Throwable ex = null; try { res = onExecute(params); } catch (Throwable e) { ex = e; } return new Pair<Result, Throwable>(res, ex); } @Override protected final void onPostExecute(Pair<Result, Throwable> result) { if (mCancelled) { return; } try { if (result.first != null) { onPostExecuteSuccess(result.first); } else { onPostExecuteFailure(result.second); } } catch (Throwable t) { t.printStackTrace(); } } /** * 继承这个方法来实现线程调用 * * @param params * @return * @throws Exception */ protected abstract Result onExecute(Params... params) throws Exception; /** * 调用成功 * * @param result */ protected void onPostExecuteSuccess(Result result) { if (mCallback != null) { mCallback.onTaskSuccess(0, result); } } /** * 失败 并返回异常 * * @param exception */ protected void onPostExecuteFailure(Throwable exception) { if (mCallback != null) { mCallback.onTaskFailure(0, exception); } } /** * 取消任务 */ public void stop() { mCancelled = true; super.cancel(true); } protected boolean isUserCancelled() { return mCancelled; } /** * @param params */ public void start(Params... params) { if (Build.VERSION.SDK_INT > 10) { super.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); } else { super.execute(params); } } }