package com.example.basetask;
import android.R.integer;
import android.content.Context;
/**
* <code>BaseTask</code>
* @description: TODO(基本异步任务信息)
* @version 1.0
* @author yourname
* @since 2012-2-3
*/
public abstract class BaseTask {
//任务是否已退出。
//private boolean canceled = false;
//标识任务状态
private int status = 0;
//是否任务取消标志
private boolean cancelFlag = false;
//任务是否成功标志
private boolean successFlag = false;
public boolean isSuccess() {
return successFlag;
}
public void setSuccessFlag(boolean successFlag) {
setFinishStatus();
this.successFlag = successFlag;
}
//错误信息
private String errorMessage;
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public RuntimeException getException() {
return exception;
}
public void setException(RuntimeException exception) {
this.exception = exception;
}
//任务异常
private RuntimeException exception;
//等待开始状态
private static final int WAIT = 0;
//任务执行中
private static final int PROCESS = 1;
//任务取消
//private static final int CANCEL = 2;
//任务完成
private static final int FINISH = 3;
public void resetTask(){
status = WAIT;
}
/**
* 退出任务
*/
public void cancelTask(){
//setCancle(true);
cancelFlag = true;
}
private void setFinishStatus(){
status = FINISH;
}
/**
* 命令任务退出
* @param canceled
*/
/* private void setCancle(boolean canceled)
{
this.canceled = canceled;
}*/
public boolean isCancel()
{
return cancelFlag;
}
public boolean isCancelAtDialogDismiss() {
return false;
}
/**
* <code>prepareTask</code>
* @description: TODO(执行前准备函数)
* @param params
* @since 2012-2-3 yourname
*/
public void prepareTask(Void... params){
status=PROCESS;
};
/**
* <code>doTask</code>
* @description: TODO(执行任务)
* @throws POAException
* @since 2012-2-3 yourname
*/
public abstract void doTask() throws RuntimeException;
/**
* <code>success</code>
* @description: TODO(成功处理函数)
* @since 2012-2-3 yourname
*/
public void success(){
setFinishStatus();
};
public boolean hasFinish(){
return status == FINISH;
}
/**
* <code>fail</code>
* @description: TODO(失败处理函数)
* @param errorMessage
* @since 2012-2-3 yourname
*/
public void fail(RuntimeException e){
if(e!=null)
fail(e.getMessage());
else
fail("");
// setFinishStatus();
};
/**
* <code>fail</code>
* @description: TODO(失败处理函数)
* @param errorMessage
* @since 2012-2-3 yourname
*/
public void fail(String errorMessage){
setFinishStatus();
};
/**
* 取消任务后调用函数
*/
public void cancel(){
if(cancelListener!=null){
cancelListener.cancel(this);
}
};
public Context getContext(){return null;};
private ITaskCancel cancelListener;
ITaskCancel getCancelListener() {
return cancelListener;
}
void setCancelListener(ITaskCancel cancelListener) {
this.cancelListener = cancelListener;
}
public interface ITaskCancel{
void cancel(BaseTask task);
}
}
package com.example.basetask;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
/**
* 串行执行任务
* @author jhzhangnan1
*
*/
public class ConcurrenceExcutor {
protected Handler mainHandler ;
protected Vector<BaseTask> waitTasks,tmptasks,processTasks;
// protected BaseTask currentTask;
private int maxThreads = 10;
private ExecutorService executorService;
private ConcurrenceExcutor(){
this(10);
}
public static ConcurrenceExcutor getInstance(){
return excutor;
}
private static ConcurrenceExcutor excutor = new ConcurrenceExcutor();
/**
*?
*/
/* private void cancelTaskAtDialogDismiss(){
if(currentTask!=null&¤tTask.isCancelAtDialogDismiss())
{
cancelCurrentTask();
}
}
private void cancelCurrentTask(){
removeTask(currentTask);
}*/
public ConcurrenceExcutor(int maxThreadCount)
{
this.maxThreads = maxThreadCount;
mainHandler = new Handler(Looper.getMainLooper());//
waitTasks = new Vector<BaseTask>();
tmptasks = new Vector<BaseTask>();
processTasks = new Vector<BaseTask>();
executorService = Executors.newFixedThreadPool(maxThreads);
}
public void cancelTask(BaseTask task){
if(task!=null)
{
waitTasks.remove(task);
processTasks.remove(task);
finishExecute();
task.cancelTask();
}
}
public void addTaskFirst(BaseTask task)
{
waitTasks.add(0,task);
start();
}
public void addTask(BaseTask task)
{
waitTasks.add(task);
start();
}
public void removeTask(BaseTask task){
if (waitTasks!=null && waitTasks.contains(task)) {
waitTasks.remove(task);
}
/*if (processTasks!=null && processTasks.contains(task)) {
processTasks.remove(task);
}*/
}
public void appendTask(BaseTask task)
{
waitTasks.add(task);
start();
}
public void start()
{
iterateTask();
}
/**
* 是否存在任务
* @param task
* @return
*/
public boolean hasTask(BaseTask task) {
synchronized (waitTasks) {
if (waitTasks != null) {
// return allTasks.contains(task);
if (waitTasks.contains(task))
return true;
else if (processTasks != null && processTasks.contains(task)) {
return true;
}
return false;
} else {
if (processTasks != null && processTasks.contains(task)) {
return true;
}
return false;
}
}
// return allTasks.contains(task)||processTasks.contains(task);
}
/**
* 如果任务不在执行时,则添加到任务中,否则不做任何处理
* @param task
*/
public void executeTaskIfNotExist(BaseTask task){
if(!hasTask(task)){
appendTask(task);
}
}
/**
* 如果任务正在执行,则先取消任务,然后再加入到任务队列中。
* @param task
*/
public void cancelBeforeExecute(BaseTask task){
if(task!=null){
cancelTask(task);
}
}
static abstract class BaseRunnable implements Runnable
{
public BaseTask currentTask;
public BaseRunnable(BaseTask currentTask)
{
this.currentTask = currentTask;
}
@Override
public void run() {
// TODO Auto-generated method stub
}
}
protected void iterateTask() {
if(waitTasks != null&&waitTasks.size()>0)
{
while(waitTasks.size()>0)
{
BaseTask currentTask;
if(processTasks.size()>=maxThreads){
break;
}
synchronized(this)
{
if(processTasks.size()>=maxThreads){
break;
}
currentTask = waitTasks.remove(0);
if(currentTask!=null)
processTasks.add(currentTask);
}
if(currentTask!=null)
{
//processTasks.add(currentTask);
if(!currentTask.isCancel())
{
mainHandler.post(new BaseRunnable(currentTask) {
@Override
public void run() {
// TODO Auto-generated method stub
if(currentTask!=null)
{
if(!currentTask.isCancel())
prepare(currentTask);
else
{
cancelTask(currentTask);
iterateTask();
}
}
else
{
iterateTask();
}
}
});
}
else
{
currentTask.cancel();
}
}
}
/* executorService.submit(new Runnable() {
private BaseTask currentTask;
@Override
public void run() {
// TODO Auto-generated method stub
// Looper.prepare();
if(tasks != null&&tasks.size()>0)
{
currentTask = null;
while(tasks.size()>0)
{
currentTask = tasks.remove(0);
if(currentTask!=null&&!currentTask.isCancel())
{
mainHandler.post(new BaseRunnable(currentTask) {
@Override
public void run() {
// TODO Auto-generated method stub
if(currentTask!=null)
{
if(!currentTask.isCancel())
excute(currentTask);
else
currentTask.cancel();
}
else
{
iterateTask();
}
}
});
}
}
}
}
});*/
}
}
void prepare(BaseTask currentTask) {
if(currentTask!=null)
{
// ConcurrenceExcutor.this.currentTask = currentTask;
if(!currentTask.isCancel())
{
currentTask.prepareTask();
executorService.submit(new BaseRunnable(currentTask) {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
try {
doInBackground(currentTask);
} catch (final RuntimeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
taskFailed(currentTask, e);
}
catch (final Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
taskFailed(currentTask, new RuntimeException(e));
}
}
});
}
else
{
cancelTask(currentTask);
}
}
}
private void doInBackground(BaseTask currentTask)
throws RuntimeException {
if(!currentTask.isCancel())
{
// currentTask.setSuccessFlag(true);
// Log.e("doTask", "doTask");
currentTask.doTask();
if(!currentTask.hasFinish()){
currentTask.setSuccessFlag(true);
}
if(currentTask.isSuccess()){
// Log.e("doTask", "isSuccess");
mainHandler.post(new BaseRunnable(currentTask){
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
if(currentTask!=null)
{
if(!currentTask.isCancel())
{
currentTask.success();
processTasks.remove(currentTask);
finishExecute();
}
else
cancelTask(currentTask);
}
// ConcurrenceExcutor.this.currentTask = null;
iterateTask();
}});
}
else{
// Log.e("doTask", "failed");
if(currentTask.getException()!=null){
taskFailed(currentTask, currentTask.getException());
}
else{
taskFailed(currentTask,new RuntimeException(currentTask.getErrorMessage()));
}
}
}
else
{
mainHandler.post(new BaseRunnable(currentTask){
@Override
public void run() {
cancelTask(currentTask);
}
});
iterateTask();
}
}
private void taskFailed(BaseTask currentTask, final RuntimeException e) {
currentTask.setSuccessFlag(false);
currentTask.setException(e);
mainHandler.post(new BaseRunnable(currentTask) {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
if (currentTask != null) {
if (!currentTask.isCancel()) {
currentTask.fail(e);
processTasks.remove(currentTask);
finishExecute();
} else
cancelTask(currentTask);
}
// ConcurrenceExcutor.this.currentTask = null;
iterateTask();
}
});
}
//所有任务执行完成后执行的操作
private AllTaskFinish allFinish;
/**
* 设置所有任务完成后的回调
* @param allFinish
*/
public void setTaskFinishCallBack(AllTaskFinish allFinish){
this.allFinish = allFinish;
}
private void finishExecute(){
if(waitTasks.size()==0&&processTasks.size()==0&&allFinish!=null){
allFinish.finish();
}
}
public void exit()
{
if(waitTasks!=null)
{
tmptasks.clear();
for(BaseTask task:waitTasks)
task.cancelTask();
waitTasks.clear();
processTasks.clear();
tmptasks = null;
waitTasks = null;
}
}
public void clearall()
{
if(waitTasks!=null)
{
for(BaseTask task:waitTasks)
task.cancelTask();
waitTasks.clear();
processTasks.clear();
}
}
public void exit(Context context)
{
if(waitTasks!=null)
{
tmptasks.clear();
for(BaseTask task:waitTasks)
{
if(task!=null)
{
if(task.getContext()==null||task.getContext()!=context)
tmptasks.add(task);
else
task.cancelTask();
}
}
waitTasks.clear();
waitTasks.addAll(tmptasks);
}
}
}
package com.example.basetask;
import java.util.Random;
import android.util.Log;
public class TestTask extends BaseTask{
private int id;
public TestTask(int id){
this.id=id;
}
@Override
public void doTask() throws RuntimeException {
for(int i=0;i<100;i++){
try {
Thread.sleep(new Random().nextInt(100));
/*if(i==99){
int m=1/0;
}*/
} catch (InterruptedException e) {
//Log.i("zhouke", "error");
e.printStackTrace();
}
}
}
@Override
public void success() {
// TODO Auto-generated method stub
Log.i("zhouke", "doTask..over success"+Thread.currentThread().getName()+id);
super.success();
}
@Override
public void fail(String errorMessage) {
Log.i("zhouke", "doTask..fail"+Thread.currentThread().getName());
super.fail(errorMessage);
}
}
package com.example.basetask;
public interface AllTaskFinish {
public void finish();
}