package com.mcxiaoke.minicat.task;
import android.content.Context;
import android.os.AsyncTask;
import com.mcxiaoke.minicat.AppContext;
/**
* @param <Params>
* @param <Progress>
* @param <Result>
* @author mcxiaoke
* @version 1.1 2012.03.13
*/
public abstract class BetterAsyncTask<Params, Progress, Result> extends
AsyncTask<Params, Progress, Result> {
private final String callerId;
private Exception error;
public BetterAsyncTask(Context context) {
super();
this.callerId = context.getClass().getCanonicalName();
}
protected abstract void onPrepare(Context context);
protected abstract void onPost(Context context, Result result);
protected abstract void onError(Context context, Exception exception);
protected abstract Result run(Params... params) throws Exception;
@Override
protected final Result doInBackground(Params... params) {
try {
return run(params);
} catch (Exception e) {
this.error = e;
return null;
}
}
@Override
protected void onPreExecute() {
super.onPreExecute();
Context context = getCallingCotext();
if (context == null) {
cancel(true);
return;
}
onPrepare(context);
}
@Override
protected final void onPostExecute(Result result) {
super.onPostExecute(result);
Context context = getCallingCotext();
if (context == null) {
return;
}
if (error == null) {
onPost(context, result);
} else {
onError(context, error);
}
}
protected void setError(Exception e) {
this.error = e;
}
protected Context getCallingCotext() {
Context caller = AppContext.getActiveContext(callerId);
if (caller == null
|| !this.callerId.equals(caller.getClass().getCanonicalName())) {
return null;
}
return caller;
}
}