package com.mfh.comna.comn.logic; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import android.app.ProgressDialog; import android.os.AsyncTask; /** * 对android的异步任务再做包装,支持多项异步任务、启动前显示等待框等, * 异常处理封装并提示出错消息等。 * 因为是多任务,故每个任务的参数和返回值类型可能不同,不能统一定义,所以都采用Object作为泛型。 * 进度值泛型则统一采用Integer整形。 * @param <P> 参数 * @param <T> 结果 * @author zhangyz created on 2013-5-15 * @since Framework 1.0 */ public final class MyMultiAsyncTask<P, T> extends AsyncTask<P, Integer, T> implements IPublishProgressAble<Integer>{ private boolean progress = true; private int rate = 1000 * 1;//每秒 public static int TASK_KIND_DEFAULT = 0; private IAsyncTask<P, T> handle; private int taskKind = TASK_KIND_DEFAULT;// 任务类型,固定的参数 private transient P[] params;//传递的参数 private transient ProgressDialog progressDialog = null; private transient Throwable processEx = null;//处理过程中产生的异常 private Logger logger = null; protected Logger getLogger() { if (logger == null) logger = LoggerFactory.getLogger(MyMultiAsyncTask.class); return logger; } public MyMultiAsyncTask(IAsyncTask<P, T> handle) { super(); this.handle = handle; } public MyMultiAsyncTask(IAsyncTask<P, T> handle, int taskKind) { super(); //this.context = context; this.handle = handle; if (taskKind == 0) throw new RuntimeException("默认的任务类型就是" + Integer.toString(taskKind) + "!请重新指定!"); this.taskKind = taskKind; } @Override protected void onPreExecute() { super.onPreExecute(); progressDialog = handle.onPreExecute(taskKind); } @Override public void publishProgressByService(Integer... param) { super.publishProgress(param); } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); handle.onProgressUpdate(taskKind, values); } @Override protected T doInBackground(P... params) { try { // publishProgress(1);//会触发执行onProgressUpdate this.params = params; return handle.doInBackground(taskKind, params); } catch (Throwable ex) {// 需要自己处理异常,否则后面不会执行onPostExecute getLogger().error(ex.getMessage(), ex); processEx = ex; return null; } } @Override protected void onPostExecute(T result) {// 装载结束 super.onPostExecute(result); try { if (processEx == null) {//成功执行 handle.onPostExecute(taskKind, result, params); hideProgressDialog(); } else { hideProgressDialog(); handle.doInBackgroundException(taskKind, processEx, params); } } catch (Throwable ex) { hideProgressDialog(); getLogger().error(null, ex); } } public boolean isProgress() { return progress; } public int getRate() { return rate; } public void setProgress(boolean progress) { this.progress = progress; } public void setRate(int rate) { this.rate = rate; } /** * 隐藏进度条 * */ private void hideProgressDialog(){ if (progressDialog != null) { progressDialog.dismiss(); progressDialog = null; } } }