android 基本任务 的执行原理分析

本文介绍了一个用于Android平台的基本异步任务管理类BaseTask及其配套的并发执行管理类ConcurrenceExcutor。BaseTask提供了任务的状态管理和执行流程控制,而ConcurrenceExcutor则实现了多个BaseTask的串行执行,支持任务的添加、取消和执行状态的检查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值