/** * @description:本地且耗时较短的异步任务 * @author chenshiqiang E-mail:csqwyyx@163.com * @date 2014年5月17日 上午12:00:40 * @version 1.0 */ package com.csq.thesceneryalong.utils.tasks; import java.lang.ref.WeakReference; import android.annotation.SuppressLint; import android.app.Activity; import android.os.AsyncTask; import android.os.Build; abstract public class CsqBackgroundTask<T> extends AsyncTask<Void, Integer, T> { private WeakReference<Object> weakHolder; /** * @param holder AsyncTask的容器,也是执行回调的class,可能为Activity或Service,弱引用,防止任务长时间引用导致内存泄漏 */ public CsqBackgroundTask(Object holder) { weakHolder = new WeakReference<Object>(holder); } /** * 无需回调,异步短时任务 * @author chenshiqiang E-mail:csqwyyx@163.com */ public CsqBackgroundTask() { } @Override protected final T doInBackground(Void... voids) { T result = null; try { result = onRun(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return result; } @SuppressLint("NewApi") private boolean canContinue() { if(weakHolder == null){ return false; } Object h = weakHolder.get(); if(h instanceof Activity){ return h != null && ((Activity)h).isFinishing() == false; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { if(h instanceof android.support.v4.app.Fragment){ return h != null && ((android.support.v4.app.Fragment)h).isRemoving() == false; } } if(h instanceof android.support.v4.app.Fragment){ return h != null && ((android.support.v4.app.Fragment)h).isRemoving() == false; } return true; } @Override protected void onPostExecute(final T t) { if (canContinue()) { onResult(t); } } abstract protected T onRun(); abstract protected void onResult(T result); public void start(){ execute(); } }