package com.mfh.comna.comn.logic;
import android.app.Dialog;
import android.os.AsyncTask;
import com.mfh.comna.api.ui.dialog.DialogHelper;
import com.mfh.comna.bizz.BizApplication;
import com.mfh.comna.comn.ComnApplication;
import com.mfh.comna.utils.DialogUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 对android核心异步任务的再封装,可以支持处理异常等,支持日志等.
* 若需处理异常继承doInBackgroundException()即可。
* Created by Administrator on 14-6-13.
*/
public abstract class MyAsyncTask<P, T> extends AsyncTask<P, Integer, T> {
private boolean progress = true;
private int rate = 1000 * 1;//每秒
private transient P[] params;//传递的参数
protected transient Dialog progressDialog = null;
private transient Throwable processEx = null;//处理过程中产生的异常
private Logger logger = null;
/**
* 获取日志
* @return
*/
protected Logger getLogger() {
if (logger == null)
logger = LoggerFactory.getLogger(this.getClass());
return logger;
}
protected MyAsyncTask(boolean showDialog) {
if (showDialog)
progressDialog = DialogHelper.genProgressDialog(ComnApplication.getAppContext(), false, null);
else
progressDialog = null;
}
/**
* 执行后台任务,若有异常直接抛出即可
* @param params 原始参数
* @return 成功执行后返回结果
*/
protected abstract T doInBackgroundInner(P... params);
/**
* 成功执行
* @param result 执行结果
* @param params 原始参数
*/
protected abstract void onPostExecuteInner(T result, P... params);
/**
* 处理异常,子类无须理会亦可
* @param ex
* @param params
*/
protected void doInBackgroundException(Throwable ex, P... params) {
}
@Override
protected void onPreExecute() {
}
@Override
protected T doInBackground(P... params) {
this.params = params;
try {
return doInBackgroundInner( 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) {//成功执行
onPostExecuteInner(result, params);
// 隐藏进度条
hideProgressDialog();
}
else {
// 隐藏进度条
hideProgressDialog();
try {
DialogUtil.showHint(processEx.getMessage());
doInBackgroundException(processEx, params);
}
catch (Throwable ex) {
getLogger().error(ex.getMessage(), ex);
}
}
}
catch (Throwable ex) {
try {
hideProgressDialog();
getLogger().error(null, ex);
}
catch (Throwable ex2) {
;
}
}
}
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;
}
}
}