org.xutils.common.task.AbsTask

package org.xutils.common.task;



import org.xutils.common.Callback;



import java.util.concurrent.Executor;



/**

* @author 注释者:王教成

* @version 注释版:1.0.0

* 异步任务基类

* @param <ResultType> 泛型

*/

public abstract class AbsTask<ResultType> implements Callback.Cancelable {

private TaskProxy taskProxy = null;//声明异步任务代理

   private final Callback.Cancelable cancelHandler;//声明回调接口中可取消接口

   private volatile boolean isCancelled = false;//声明是否已取消标记

   private volatile State state = State.IDLE;//声明内部状态类实例IDLE

   private ResultType result;//声明泛型类型

   public AbsTask() {

this(null);

   }//构造器

   public AbsTask(Callback.Cancelable cancelHandler) {

this.cancelHandler = cancelHandler;

   }//构造器:初始化回调接口中可取消接口



   //子类实现抽象方法3个

   protected abstract ResultType doBackground() throws Throwable;//背景抽象方法

   protected abstract void onSuccess(ResultType result);//成功抽象方法

   protected abstract void onError(Throwable ex, boolean isCallbackError);//错误抽象方法



   //子类重写空方法5个

   protected void onWaiting() {

}//等待中方法

   protected void onStarted() {

}//已开始方法

   protected void onUpdate(int flag, Object... args) {

}//升级方法

   protected void onCancelled(Callback.CancelledException cex) {

}//已取消方法

   protected void onFinished() {

}//已完成方法



   //子类重写getter方法2个

   public Priority getPriority() {

return null;

   }//获取优先级方法

   public Executor getExecutor() {

return null;

   }//获取执行器方法



   /**

    * 封装异步任务代理类中实现的本类onUpdate方法

    * @param flag 旗标

    * @param args 对象数组

    */

   protected final void update(int flag, Object... args) {

if (taskProxy != null) {

taskProxy.onUpdate(flag, args);//任务代理器非空执行实例方法

       }

}



/**

    * HTTP任务类中实现

    * @return 返回取消任务时是否不等待任务彻底结束,立即收到取消的通知

    */

   protected boolean isCancelFast() {

return false;

   }

/**

    * HTTP任务类中实现,通过cancel方法调用

    */

   protected void cancelWorks() {

}

/**

    * 实现回调接口中可取消接口内取消回调方法

    */

   @Override

   public final synchronized void cancel() {

if (!this.isCancelled) {

this.isCancelled = true;

           cancelWorks();//调用本类中方法

           if (cancelHandler != null && !cancelHandler.isCancelled()) {

cancelHandler.cancel();//非空或true执行cancel方法

           }

if (this.state == State.WAITING || (this.state == State.STARTED && isCancelFast())) {

if (taskProxy != null) {

taskProxy.onCancelled(new Callback.CancelledException("cancelled by user"));

                   taskProxy.onFinished();

               } else if (this instanceof TaskProxy) {

this.onCancelled(new Callback.CancelledException("cancelled by user"));

                   this.onFinished();

               }

}//如果等待状态,或者状态已开始且快速取消false

       }

}



/**

    * 判断是否已取消

    * @return 返回是否已取消

    */

   @Override

   public final boolean isCancelled() {

return isCancelled || state == State.CANCELLED ||

(cancelHandler != null && cancelHandler.isCancelled());

   }//返回false,或状态是否已取消,或是否可取消接口非空与判断已取消都true

   /**

    * 判断是否已完成

    * @return 返回是否已完成

    */

   public final boolean isFinished() {

return this.state.value() > State.STARTED.value();

   }



/**

    * 设置异步任务代理器

    * @param taskProxy 异步任务代理器

    */

   /*package*/

   final void setTaskProxy(TaskProxy taskProxy) {

this.taskProxy = taskProxy;

   }



/**

    * 获取泛型结果类型

    * @return 返回泛型结果类型

    */

   public final ResultType getResult() {

return result;

   }

/**

    * 设置泛型结果类型

    * @param result 泛型结果类型

    */

   /*package*/

   final void setResult(ResultType result) {

this.result = result;

   }



/**

    * 获取状态

    * @return 返回状态

    */

   public final State getState() {

return state;

   }

/**

    * 设置状态

    * @param state 状态

    */

   /*package*/

   void setState(State state) {

this.state = state;

   }



/**

    * 状态枚举内部类

    */

   public enum State {

IDLE(0), WAITING(1), STARTED(2), SUCCESS(3), CANCELLED(4), ERROR(5);

       private final int value;

       private State(int value) {

this.value = http://www.gunmi.cn/v/value;

       }//构造器

       /**

        * 获取value值

        * @return 返回value值

        */

       public int value() {

return value;

       }

}

}

org.xutils.common.task.AbsTask