package com.mfh.comna.comn.logic; import com.mfh.comn.net.data.IResponseData; import com.mfh.comna.comn.database.dao.NetProcessor; import java.util.Iterator; /** * 异步环境下,执行连续的多个网络任务。每个任务异步执行完毕后,再顺序启动下一个任务,直至全部任务执行结束。 * @param <T> 每个任务执行完毕返回的bean * @param <Param> 执行参数 * @param <TaskKind> 每个任务具有一个编号以便于调度,该参数指编号的类型 */ public class MultiContinuousTask<T, Param, TaskKind> { /** * 回调方法接口定义 * @param <T> * @param <Param> * @param <TaskKind> */ public interface MultiTaskCallBack<T, Param, TaskKind> { /** * 执行后台下载,后台线程中 * @param paramIn 参数 * @param taskKind 当前哪种任务 * @param callbackMethod 回调函数 */ void doOneTask(Param paramIn, TaskKind taskKind, NetProcessor.Processor<T> callbackMethod); /** * 下载成功后执行,主线程中 * @param rs 网络调用执行结果 * @param taskKind 当前任务类型 */ void afterOneTask(IResponseData rs, TaskKind taskKind); /** * 任务全部执行完毕 */ void onFinishTasks(); /** * 任务执行发送异常 */ void onError(Throwable ex); } protected MultiTaskCallBack<T, Param, TaskKind> asyncTask = null; protected Iterator<TaskKind> taskIter = null; protected Param param; protected TaskKind taskKind; protected Throwable havedEx = null;//后台执行时发生了异常。 private NetProcessor.Processor<T> callbackMethod = null; /** * 构造函数 * @param taskIter 任务迭代器,用于支持多任务,每次执行一个任务。每个任务会分页执行多次请求。 * @param asyncTaskIn 回调接口,一个是下载接口实现,一个是下载完成后接口实现 */ public MultiContinuousTask(Iterator<TaskKind> taskIter, final MultiTaskCallBack<T, Param, TaskKind> asyncTaskIn) { this.taskIter = taskIter; this.asyncTask = asyncTaskIn; } public NetProcessor.Processor<T> getCallbackMethod() { if (callbackMethod == null) { callbackMethod = genProcessor(); } return callbackMethod; } /** * 构造回调函数 * @return */ protected NetProcessor.Processor<T> genProcessor() { NetProcessor.Processor<T> callbackMethod = new NetProcessor.Processor<T>() { //此处代码本身还是在主线程运行 @Override public void processResult(IResponseData rs) { try { asyncTask.afterOneTask(rs, taskKind); } catch(Throwable ex) { asyncTask.onError(ex); return; } nextWork(); } //此处代码本身还是在主线程运行 @Override protected void processFailure(Throwable t, String errMsg) { super.processFailure(t, errMsg); asyncTask.onError(t); } }; return callbackMethod; } /** * 启动任务 * @param param 传入的参数 */ public void startWork(Param param) { this.param = param; nextWork(); } /** * 启动或继续任务序列 */ protected void nextWork() { if (hasNextTask()) { nextTask(); startContinueTask(param); } else asyncTask.onFinishTasks(); } /** * 执行或继续执行一个任务 * @param param */ protected void startContinueTask(Param param) { try { //此处代码本身还是在主线程运行 asyncTask.doOneTask(param, taskKind, getCallbackMethod()); } catch(Throwable ex) { asyncTask.onError(ex); return; } } /** * 是否还有下一个任务需要执行 * @return */ private boolean hasNextTask() { return taskIter.hasNext(); } /** * 执行下一个任务 */ protected void nextTask() { taskKind = taskIter.next(); } public Param getParam() { return param; } }