package mobi.monaca.utils;
import android.os.AsyncTask.Status;
import android.os.Handler;
/**
* Used to kick ass Android AsyncTask's bug where doInBackground() is not always get called
* @param <A> parameter types for execute() method
* @param <B> type used for onProgressUpdate()
* @param <C> type returned by doInBackground()
*/
abstract public class MyAsyncTask<A, B, C> {
protected boolean isExecuted = false;
protected Thread backgroundThread = null;
final Handler handler = new Handler();
private boolean mIsCancelled = false;
private Status currentStatus = Status.PENDING;
public void execute(final A ...a) {
if (isExecuted) {
throw new RuntimeException("This task is already executed.");
}
onPreExecute();
isExecuted = true;
currentStatus = Status.RUNNING;
backgroundThread = new Thread(new Runnable() {
@Override
public void run() {
final C result = doInBackground(a);
handler.post(new Runnable() {
@Override
public void run() {
onPostExecute(result);
currentStatus = Status.FINISHED;
}
});
}
});
backgroundThread.start();
}
protected void onPreExecute() {
}
protected void publishProgress(final B ...b){
handler.post(new Runnable() {
@Override
public void run() {
onProgressUpdate(b);
}
});
}
public void cancel(boolean mayInterruptIfRunning) {
if(mayInterruptIfRunning){
if (backgroundThread != null) {
backgroundThread.interrupt();
}
}
mIsCancelled = true;
}
public Status getStatus(){
return currentStatus;
}
public boolean isCancelled() {
return mIsCancelled ;
}
public boolean isExecuted() {
return isExecuted;
}
abstract protected C doInBackground(A ...a);
protected void onPostExecute(C result) {
}
protected void onProgressUpdate(B ...b) {
}
}