java.lang.Object
cn.wjybxx.btree.Task<T>
- 类型参数:
T- 黑板的类型
- 所有已实现的接口:
ICancelTokenListener
- 直接已知子类:
BranchTask,Decorator,LeafTask,TaskEntry
取消
1.取消默认是协作式的,依赖于任务自身检查;如果期望更及时的响应取消信号,则需要注册注册监听器。 2.通常在执行外部代码后都应该检测. 3.一般而言,不管理上下文的节点在子节点取消时都应该取消自己(因为是同一个CancelToken) 4.Task类默认只在心跳方法中检测取消信号,任何的回调和事件方法中都由用户自身检测。 5.Task在运行期间,最多只应该添加一次监听。心跳+事件驱动
1.心跳为主,事件为辅。 2.心跳不是事件!心跳自顶向下驱动,事件则无规律。- 作者:
- wjybxx date - 2023/11/25
-
字段概要
字段修饰符和类型字段说明protected T任务运行时依赖的黑板(主要上下文) 1.每个任务可有独立的黑板(数据); 2.运行时不能为null; 3.如果是自动继承的,exit后自动删除;如果是Control赋值的,则由control删除。protected CancelToken取消令牌(取消上下文) 1.每个任务可有独立的取消信号; 2.运行时不能为null; 3.如果是自动继承的,exit后自动删除;如果是Control赋值的,则由control删除。protected int任务的自定义标识 1.对任务进行标记是一个常见的需求,我们将其定义在顶层以简化使用 2.在运行期间不应该变动 3.高8位为流程控制特征值,会在任务运行前拷贝到ctl -- 以支持在编辑器导中指定Task的运行特征。static final org.slf4j.Loggerstatic final intstatic final intstatic final intstatic final intstatic final int高8位为流程控制特征值(对外开放)static final intstatic final intstatic final intprotected Object共享属性(配置上下文) 1.用于解决【数据和行为分离】架构下的配置需求,主要解决策划的配置问题,减少维护工作量。 -
构造器概要
构造器 -
方法概要
修饰符和类型方法说明final int1.尽量不要在运行时增删子节点(危险操作) 2.不建议将Task从一棵树转移到另一棵树,可能产生内存泄漏(引用未删除干净)protected abstract intaddChildImpl(Task<T> task) protected void该方法用于初始化对象。booleancanHandleEvent(Object event) 该方法用于测试自己的状态和事件数据 (任何事件处理中,都用用户自身检测取消信号)final booleancheckCancel(int rid) 检查取消protected voidenter(int reentryId) 该方法在Task进入运行状态时执行 1.数据初始化需要放在beforeEnter()中,避免执行逻辑时对象未初始化完成。protected abstract voidexecute()Task的心跳方法,在Task进入完成状态之前会反复执行。protected voidexit()该方法在Task进入完成状态时执行 1.该方法与enter(int)对应,通常用于停止enter(int)中启动的逻辑。final void将task上的临时控制标记写回到flags中final Tfinal CancelTokengetChild(int index) 获取指定索引的childabstract int子节点的数量(仅包括普通意义上的child,不包括钩子任务)final Objectfinal int获取任务的控制流标记位final int获取行为树绑定的实体 -- 最好让Entity也在黑板中final intfinal intgetFlags()getGuard()final int获取归一化后的状态码,所有的失败码都转换为TaskStatus.ERRORfinal int获取任务前一次的执行结果 1.取值范围[0,63] -- 其实只要能区分成功失败就够; 2.这并不是一个运行时必须的属性,而是为Debug和UI视图服务的;final int获取重入id 1.重入id用于解决事件(或外部逻辑)可能使当前Task进入完成状态的问题。final int运行的帧数 1.任务如果在首次execute()的时候就进入完成状态,那么运行帧数0 2.运行帧数是非常重要的统计属性,值得我们定义在顶层.final Objectfinal int获取原始的状态码intindexChild(Task<?> task) final boolean当前节点及其所有父节点是否都为active状态final boolean当前节点自身是否为active状态final booleanfinal booleanfinal booleanfinal boolean任务是否已被取消final booleanfinal boolean当前是否是条件检查上下文final boolean任务是否已完成(成功、失败、取消)final booleanexecute方法是否是enter触发的 1.用于execute()方法判断当前是否和enter(int)在同一帧,以决定是否执行某些逻辑。protected final boolean是否正在执行execute()方法 该方法非常重要,主要处理心跳和事件方法之间的冲突。final booleanisExited(int rid) 重入id对应的任务是否已退出,即:是否已执行exit()方法。final booleanexit方法是否是由stop()方法触发的final booleanisFailed()任务是否已失败final boolean任务是否已失败或被取消final booleantask是否支持内联final booleanfinal booleanfinal boolean任务是否正在运行final booleanfinal boolean任务是否未启动就失败了。final boolean任务是否已成功protected void当节点在层次结构中的Active状态发生变化时调用 1.该方法只在Task处于运行状态下调用。voidonCancelRequested(CancelToken cancelToken) 取消令牌的回调方法 注意:如果未启动自动监听,手动监听时也建议绑定到该方法protected abstract voidonChildCompleted(Task<T> child) 子节点进入完成状态 1.避免方法数太多,实现类测试task的status即可 2.getNormalizedStatus()有助于switch测试 3.task可能是取消状态,甚至可能没运行过直接失败(前置条件失败) 4.钩子任务和guard不会调用该方法 5.isExecuting()有助于检测冲突,减少调用栈深度 6.同一子节点连续通知的情况下,completed的逻辑应当覆盖onChildRunning(Task)的影响。protected abstract voidonChildRunning(Task<T> child) 子节点还需要继续运行 1.child在一次运行期间只会通知一次 2.该方法不应该触发状态迁移,即不应该使自己进入完成状态final voidTask收到外部事件protected abstract voidonEventImpl(Object event) 对于控制节点,通常将事件派发给约定的子节点或钩子节点。final void注册取消信号监听器,任务在退出时将自动触发删除final void删除所有的child -- 不是个常用方法removeChild(int index) 删除指定索引的childfinal booleanremoveChild(Task<?> task) 删除指定childremoveChildImpl(int index) final void重置所有的子节点void重置任务以便重新启动(清理运行产生的所有临时数据)static voidresetForRestart(Task<?> task) 重置目标任务final voidsetActive(boolean value) 修改节点的active状态 注意: 1.active为false表示可以不执行心跳逻辑execute()2.只有停止Execute而不影响逻辑的场景,才可能需要该特性。final voidsetAutoListenCancel(boolean enable) 告知模板方法是否自动监听取消事件 1.默认值由flags中的信息指定,默认不自动监听!final voidsetAutoResetChildren(boolean enable) 告知模板方法是否在enter(int)前自动调用resetChildrenForRestart()1.默认值由flags中的信息指定,默认不启用 2.要覆盖默认值应当在beforeEnter()方法中调用 3.部分任务可能在调用resetForRestart()之前不会再次运行,因此需要该特性final voidsetBlackboard(T blackboard) final voidsetBlackboardPerChild(boolean value) 是否每个child一个独立的黑板(常见于栈式黑板) 1.默认值由flags中的信息指定,默认false 2.该值是否生效取决于控制节点的实现,这里只是提供配置接口。final void设置为取消final voidsetCancelToken(CancelToken cancelToken) final voidsetCancelTokenPerChild(boolean value) 是否每个child一个独立的取消令牌 1.默认值由flags中的信息指定,默认false 2.要覆盖默认值应当在beforeEnter()方法中调用 3.该值是否生效取决于控制节点的实现,这里只是提供配置接口。替换指定索引位置的child (该方法可避免Task的结构发生变化,也可以减少事件数)final voidsetChildCancelToken(Task<T> child, CancelToken childCancelToken) 设置子节点的取消令牌setChildImpl(int index, Task<T> task) final voidsetCompleted(int status, boolean fromChild) 设置为完成 -- 通常用于通过子节点的结果设置自己final voidsetControl(Task<T> control) 设置任务的控制节点final voidsetControlData(Object controlData) final voidsetEnterFrame(int enterFrame) 慎重调用final voidsetExitFrame(int exitFrame) 慎重调用final voidsetFailed(int status) 设置为执行失败setFlags(int flags) final voidsetGuardFailed(Task<T> control, boolean isHook) 设置为前置条件测试失败 1.该方法仅适用于control测试child的guard失败,令child在未运行的情况下直接失败的情况。final voidsetInvertedGuard(boolean enable) 当task作为guard节点时,是否取反(减少栈深度) -- 避免套用Inverter节点 1.默认值由flags中的信息指定,默认不禁用(即默认延迟通知) 2.要覆盖默认值应当在beforeEnter()方法中调用final voidsetManualCheckCancel(boolean value) 告知模板方法是否手动检测取消 1.默认值由flags中的信息指定,默认不禁用 2.是否检测取消信号是一个动态的属性,可随时更改 -- 因此不要轻易缓存。final voidsetPrevStatus(int prevStatus) final voidsetSharedProps(Object sharedProps) final voidsetSlowStart(boolean disable) 告知模板方法否将enter(int)和execute()方法分开执行。final void设置为运行成功final voidstop()强制停止任务 1.只应该由Control调用,因此不会通知Control 2.未完成的任务默认会进入Cancelled状态 3.不命名为cancel,否则容易误用;我们设计的cancel是协作式的,可通过cancelToken发出请求请求。static void停止目标任务protected void停止所有运行中的子节点 1.该方法在自身的exit之前调用 2.如果有特殊的子节点(钩子任务),也需要在这里停止 3.该方法不采用visitor实现,是因为停止任务可能有特殊的时序。final booleantemplate_checkGuard(Task<T> guard) 检查前置条件 1.如果未显式设置guard的上下文,会默认捕获当前Task的上下文 2.guard的上下文在运行结束后会被清理 3.guard只应该依赖共享上下文(黑板和props),不应当对父节点做任何的假设。final voidtemplate_execute(boolean fromControl) execute模板方法 (通过参数的方式,有助于我们统一代码,也简化子类实现;同时避免遗漏)final voidtemplate_runInlinedChild(Task<T> inlinedChild, TaskInlineHelper<T> helper, Task<T> runningChild) 执行被内联的子任务final voidtemplate_startChild(Task<T> child, boolean checkGuard) 启动子节点final voidtemplate_startHook(Task<T> hook, boolean checkGuard) 启动钩子节点 1.钩子任务不会触发onChildRunning(Task)和onChildCompleted(Task)2.前置条件其实是特殊的钩子任务 3.条件分支不应该有钩子任务final voidunsetChildCancelToken(Task<T> child) 删除子节点的取消令牌final void删除任务的控制节点(用于清理) 该方法在任务结束时并不会自动调用,因为Task上的数据可能是有用的,不能立即删除,只有用户知道是否可以清理。abstract voidvisitChildren(TaskVisitor<? super T> visitor, Object param) 访问所有的子节点(含hook节点)
-
字段详细资料
-
logger
public static final org.slf4j.Logger logger -
MASK_SLOW_START
public static final int MASK_SLOW_START- 另请参阅:
-
MASK_AUTO_RESET_CHILDREN
public static final int MASK_AUTO_RESET_CHILDREN- 另请参阅:
-
MASK_MANUAL_CHECK_CANCEL
public static final int MASK_MANUAL_CHECK_CANCEL- 另请参阅:
-
MASK_AUTO_LISTEN_CANCEL
public static final int MASK_AUTO_LISTEN_CANCEL- 另请参阅:
-
MASK_CANCEL_TOKEN_PER_CHILD
public static final int MASK_CANCEL_TOKEN_PER_CHILD- 另请参阅:
-
MASK_BLACKBOARD_PER_CHILD
public static final int MASK_BLACKBOARD_PER_CHILD- 另请参阅:
-
MASK_INVERTED_GUARD
public static final int MASK_INVERTED_GUARD- 另请参阅:
-
MASK_CONTROL_FLOW_OPTIONS
public static final int MASK_CONTROL_FLOW_OPTIONS高8位为流程控制特征值(对外开放)- 另请参阅:
-
blackboard
任务运行时依赖的黑板(主要上下文) 1.每个任务可有独立的黑板(数据); 2.运行时不能为null; 3.如果是自动继承的,exit后自动删除;如果是Control赋值的,则由control删除。 -
cancelToken
取消令牌(取消上下文) 1.每个任务可有独立的取消信号; 2.运行时不能为null; 3.如果是自动继承的,exit后自动删除;如果是Control赋值的,则由control删除。 -
flags
protected int flags任务的自定义标识 1.对任务进行标记是一个常见的需求,我们将其定义在顶层以简化使用 2.在运行期间不应该变动 3.高8位为流程控制特征值,会在任务运行前拷贝到ctl -- 以支持在编辑器导中指定Task的运行特征。
-
-
构造器详细资料
-
Task
public Task()
-
-
方法详细资料
-
getTaskEntry
-
getControl
-
getBlackboard
-
setBlackboard
-
getCancelToken
-
setCancelToken
-
getControlData
-
setControlData
-
getEnterFrame
public final int getEnterFrame() -
getExitFrame
public final int getExitFrame() -
setEnterFrame
public final void setEnterFrame(int enterFrame) 慎重调用 -
setExitFrame
public final void setExitFrame(int exitFrame) 慎重调用 -
getStatus
public final int getStatus()获取原始的状态码 -
getNormalizedStatus
public final int getNormalizedStatus()获取归一化后的状态码,所有的失败码都转换为TaskStatus.ERROR -
isRunning
public final boolean isRunning()任务是否正在运行 -
isCompleted
public final boolean isCompleted()任务是否已完成(成功、失败、取消) -
isSucceeded
public final boolean isSucceeded()任务是否已成功 -
isCancelled
public final boolean isCancelled()任务是否已被取消 -
isFailed
public final boolean isFailed()任务是否已失败 -
isFailedOrCancelled
public final boolean isFailedOrCancelled()任务是否已失败或被取消 -
getEntity
获取行为树绑定的实体 -- 最好让Entity也在黑板中 -
getRunFrames
public final int getRunFrames()运行的帧数 1.任务如果在首次execute()的时候就进入完成状态,那么运行帧数0 2.运行帧数是非常重要的统计属性,值得我们定义在顶层. -
getPrevStatus
public final int getPrevStatus()获取任务前一次的执行结果 1.取值范围[0,63] -- 其实只要能区分成功失败就够; 2.这并不是一个运行时必须的属性,而是为Debug和UI视图服务的; -
setPrevStatus
public final void setPrevStatus(int prevStatus) -
beforeEnter
protected void beforeEnter()该方法用于初始化对象。 1.不命名为init,是因为init通常让人觉得只调用一次。 2.该方法不可以使自身进入完成状态。 -
enter
protected void enter(int reentryId) 该方法在Task进入运行状态时执行 1.数据初始化需要放在beforeEnter()中,避免执行逻辑时对象未初始化完成。 2.如果要初始化子节点,也放到beforeEnter()方法; 3.允许更新自己为完成状态- 参数:
reentryId- 用于判断父类是否使任务进入了完成状态;虽然也可先捕获再调用超类方法,但传入会方便许多。
-
execute
protected abstract void execute()Task的心跳方法,在Task进入完成状态之前会反复执行。 1.可以根据isExecuteTriggeredByEnter()判断是否是与enter(int)连续执行的。 2.运行中可通过setSuccess()、setFailed(int)、setCancelled()将自己更新为完成状态。 3.不建议直接调用该方法,而是通过模板方法template_execute(boolean)运行。 -
exit
protected void exit()该方法在Task进入完成状态时执行 1.该方法与enter(int)对应,通常用于停止enter(int)中启动的逻辑。 2.该方法也用于清理部分运行时产生的临时数据。 3.一定记得取消注册的各种监听器。 -
setSuccess
public final void setSuccess()设置为运行成功 -
setCancelled
public final void setCancelled()设置为取消 -
setFailed
public final void setFailed(int status) 设置为执行失败 -
setGuardFailed
设置为前置条件测试失败 1.该方法仅适用于control测试child的guard失败,令child在未运行的情况下直接失败的情况。 2.对于运行中的child,如果发现child的guard失败,不能继续运行,应当取消子节点的执行(stop)。- 参数:
control- 由于task未运行,其control可能尚未赋值,因此要传入isHook- 是否是钩子任务,钩子任务则禁用回调
-
setCompleted
public final void setCompleted(int status, boolean fromChild) 设置为完成 -- 通常用于通过子节点的结果设置自己 -
onChildRunning
子节点还需要继续运行 1.child在一次运行期间只会通知一次 2.该方法不应该触发状态迁移,即不应该使自己进入完成状态 -
onChildCompleted
子节点进入完成状态 1.避免方法数太多,实现类测试task的status即可 2.getNormalizedStatus()有助于switch测试 3.task可能是取消状态,甚至可能没运行过直接失败(前置条件失败) 4.钩子任务和guard不会调用该方法 5.isExecuting()有助于检测冲突,减少调用栈深度 6.同一子节点连续通知的情况下,completed的逻辑应当覆盖onChildRunning(Task)的影响。 7.任何的回调和事件方法中都由用户自身检测取消信号 -
onEvent
Task收到外部事件- 另请参阅:
-
canHandleEvent
该方法用于测试自己的状态和事件数据 (任何事件处理中,都用用户自身检测取消信号)如果通过条件Task来实现事件过滤,那么通常的写法如下:
blackboard.set("event", event); // task通过黑板获取事件对象 try { return template_checkGuard(eventFilter); } finally { blackboard.remove("event"); }ps: 如果想支持编辑器中测试事件属性,event通常需要实现为KV结构。 -
onEventImpl
对于控制节点,通常将事件派发给约定的子节点或钩子节点。 对于叶子节点,通常自身处理事件。 注意: 1.转发事件时应该调用子节点的onEvent(Object)方法 2.在AI这样的领域中,建议将事件转化为信息存储在Task或黑板中,而不是尝试立即做出反应。 3.isExecuting()方法很重要 -
onCancelRequested
取消令牌的回调方法 注意:如果未启动自动监听,手动监听时也建议绑定到该方法- 指定者:
onCancelRequested在接口中ICancelTokenListener- 参数:
cancelToken- 收到取消信号的令牌
-
stop
public final void stop()强制停止任务 1.只应该由Control调用,因此不会通知Control 2.未完成的任务默认会进入Cancelled状态 3.不命名为cancel,否则容易误用;我们设计的cancel是协作式的,可通过cancelToken发出请求请求。 -
stopRunningChildren
protected void stopRunningChildren()停止所有运行中的子节点 1.该方法在自身的exit之前调用 2.如果有特殊的子节点(钩子任务),也需要在这里停止 3.该方法不采用visitor实现,是因为停止任务可能有特殊的时序。 4.如果子节点不是按原始序启动的,务必要重写该方法。 -
resetForRestart
public void resetForRestart()重置任务以便重新启动(清理运行产生的所有临时数据)1. 和exit一样,清理的是运行时产生的临时数据,而不是所有数据;不过该方法是比exit更彻底的清理。 2. 钩子任务也应当被重置。 3. 与
beforeEnter()相同,重写方法时,应先执行父类逻辑,再重置自身属性。 4. 有临时数据的Task都应该重写该方法,行为树通常是需要反复执行的。 -
resetChildrenForRestart
public final void resetChildrenForRestart()重置所有的子节点 -
isActiveSelf
public final boolean isActiveSelf()当前节点自身是否为active状态 -
isActiveInHierarchy
public final boolean isActiveInHierarchy()当前节点及其所有父节点是否都为active状态 -
setActive
public final void setActive(boolean value) 修改节点的active状态 注意: 1.active为false表示可以不执行心跳逻辑execute()2.只有停止Execute而不影响逻辑的场景,才可能需要该特性。比如:等待事件发生。 3.如果等待条件或事件的过程中需要响应超时,通常需要通过定时任务唤醒。 4.如果Task处于非运行状态,该属性在运行时被重置。 5.该属性对条件检查无效。 6.为控制复杂度,暂不打算支持activeChanged事件。 -
onActiveInHierarchyChanged
protected void onActiveInHierarchyChanged()当节点在层次结构中的Active状态发生变化时调用 1.该方法只在Task处于运行状态下调用。 2.该方法不应该产生状态迁移,即不应该使Task进入完成状态。 3.该方法主要用于暂停关联的外部逻辑,如停止外部计时器。 4.重写该方法通常应该重写enter方法,在enter方法中处理未激活的情况。 -
registerCancelListener
public final void registerCancelListener()注册取消信号监听器,任务在退出时将自动触发删除 -
checkCancel
public final boolean checkCancel(int rid) 检查取消- 参数:
rid- 重入id;方法保存的局部变量- 返回:
- 任务是否已进入完成状态;如果返回true,调用者应立即退出
- 另请参阅:
-
getReentryId
public final int getReentryId()获取重入id 1.重入id用于解决事件(或外部逻辑)可能使当前Task进入完成状态的问题。 2.如果执行的外部逻辑可能触发状态切换,在执行外部逻辑前最好捕获重入id,再执行外部逻辑后以检查是否可进行运行。 -
isExited
public final boolean isExited(int rid) 重入id对应的任务是否已退出,即:是否已执行exit()方法。 1.如果已退出,当前逻辑应该立即退出。 2.通常在执行外部代码后都应该检测,eg:运行子节点,派发事件,执行用户钩子... 3.通常循环体中的代码应该调用checkCancel(int)4.也可以用于检测是否已重新启动- 参数:
rid- 重入id;方法保存的局部变量- 返回:
- 重入id对应的任务是否已退出
-
isExecuting
protected final boolean isExecuting()是否正在执行execute()方法 该方法非常重要,主要处理心跳和事件方法之间的冲突。 利用得当可大幅降低代码复杂度,减少调用栈深度,提高性能。 -
isExecuteTriggeredByEnter
public final boolean isExecuteTriggeredByEnter()execute方法是否是enter触发的 1.用于execute()方法判断当前是否和enter(int)在同一帧,以决定是否执行某些逻辑。 2.如果仅仅是想在下一帧运行execute()的逻辑,可通过setSlowStart(boolean)实现。 3.部分Task的execute()可能在一帧内执行多次,因此不能通过运行帧数为0代替。 -
isExitTriggeredByStop
public final boolean isExitTriggeredByStop()exit方法是否是由stop()方法触发的 -
isStillborn
public final boolean isStillborn()任务是否未启动就失败了。常见原因: 1. 前置条件失败 2. 任务开始前检测到取消 -
isCheckingGuard
public final boolean isCheckingGuard()当前是否是条件检查上下文 -
setSlowStart
public final void setSlowStart(boolean disable) 告知模板方法否将enter(int)和execute()方法分开执行。 1.默认值由flags中的信息指定,默认不分开执行 2.要覆盖默认值应当在beforeEnter()方法中调用 3.该属性运行期间不应该调整,调整也无效 -
isSlowStart
public final boolean isSlowStart() -
setAutoResetChildren
public final void setAutoResetChildren(boolean enable) 告知模板方法是否在enter(int)前自动调用resetChildrenForRestart()1.默认值由flags中的信息指定,默认不启用 2.要覆盖默认值应当在beforeEnter()方法中调用 3.部分任务可能在调用resetForRestart()之前不会再次运行,因此需要该特性 -
isAutoResetChildren
public final boolean isAutoResetChildren() -
setManualCheckCancel
public final void setManualCheckCancel(boolean value) 告知模板方法是否手动检测取消 1.默认值由flags中的信息指定,默认不禁用 2.是否检测取消信号是一个动态的属性,可随时更改 -- 因此不要轻易缓存。 -
isManualCheckCancel
public final boolean isManualCheckCancel() -
setAutoListenCancel
public final void setAutoListenCancel(boolean enable) 告知模板方法是否自动监听取消事件 1.默认值由flags中的信息指定,默认不自动监听!自动监听有较大的开销,绝大多数业务只需要在Entry监听。 2.要覆盖默认值应当在beforeEnter()方法中调用 -
isAutoListenCancel
public final boolean isAutoListenCancel() -
setCancelTokenPerChild
public final void setCancelTokenPerChild(boolean value) 是否每个child一个独立的取消令牌 1.默认值由flags中的信息指定,默认false 2.要覆盖默认值应当在beforeEnter()方法中调用 3.该值是否生效取决于控制节点的实现,这里只是提供配置接口。 -
isCancelTokenPerChild
public final boolean isCancelTokenPerChild() -
setBlackboardPerChild
public final void setBlackboardPerChild(boolean value) 是否每个child一个独立的黑板(常见于栈式黑板) 1.默认值由flags中的信息指定,默认false 2.该值是否生效取决于控制节点的实现,这里只是提供配置接口。 -
isBlackboardPerChild
public final boolean isBlackboardPerChild() -
setInvertedGuard
public final void setInvertedGuard(boolean enable) 当task作为guard节点时,是否取反(减少栈深度) -- 避免套用Inverter节点 1.默认值由flags中的信息指定,默认不禁用(即默认延迟通知) 2.要覆盖默认值应当在beforeEnter()方法中调用 -
isInvertedGuard
public final boolean isInvertedGuard() -
template_execute
public final void template_execute(boolean fromControl) execute模板方法 (通过参数的方式,有助于我们统一代码,也简化子类实现;同时避免遗漏)- 参数:
fromControl- 是否由父节点调用
-
template_startChild
启动子节点- 参数:
child- 普通子节点,或需要接收通知的钩子任务checkGuard- 是否检查子节点的前置条件
-
template_startHook
启动钩子节点 1.钩子任务不会触发onChildRunning(Task)和onChildCompleted(Task)2.前置条件其实是特殊的钩子任务 3.条件分支不应该有钩子任务- 参数:
hook- 钩子任务,或不需要接收事件通知的子节点checkGuard- 是否检查子节点的前置条件
-
template_runInlinedChild
public final void template_runInlinedChild(Task<T> inlinedChild, TaskInlineHelper<T> helper, Task<T> runningChild) 执行被内联的子任务- 参数:
inlinedChild- 被内联的子节点(可以是钩子任务)helper- 存储被内联子节点的对象runningChild- 未被内联的子节点,直接子任务
-
template_checkGuard
检查前置条件 1.如果未显式设置guard的上下文,会默认捕获当前Task的上下文 2.guard的上下文在运行结束后会被清理 3.guard只应该依赖共享上下文(黑板和props),不应当对父节点做任何的假设。 4.guard永远是检查当前Task的上下文,子节点的guard也不例外。 5.guard通常不应该修改数据 6.guard默认不检查取消信号,用户可实现取消信号检测节点。 7.如果guard开启了inverter内联或包含Inverter节点,Status将不能保留原始的错误码 -- 只有Sequence能精确返回错误码。- 参数:
guard- 前置条件;可以是子节点的guard属性,也可以是条件子节点,也可以是外部的条件节点
-
setControl
设置任务的控制节点 -
unsetControl
public final void unsetControl()删除任务的控制节点(用于清理) 该方法在任务结束时并不会自动调用,因为Task上的数据可能是有用的,不能立即删除,只有用户知道是否可以清理。 -
addChild
1.尽量不要在运行时增删子节点(危险操作) 2.不建议将Task从一棵树转移到另一棵树,可能产生内存泄漏(引用未删除干净)- 参数:
task- 要添加的子节点- 返回:
- child index
-
setChild
替换指定索引位置的child (该方法可避免Task的结构发生变化,也可以减少事件数)- 返回:
- index对应的旧节点
-
removeChild
删除指定child -
removeChild
删除指定索引的child -
removeAllChild
public final void removeAllChild()删除所有的child -- 不是个常用方法 -
indexChild
- 返回:
- index or -1
-
visitChildren
访问所有的子节点(含hook节点) -
getChildCount
public abstract int getChildCount()子节点的数量(仅包括普通意义上的child,不包括钩子任务) -
getChild
获取指定索引的child -
addChildImpl
- 返回:
- 为child分配的index
-
setChildImpl
- 返回:
- 索引位置旧的child
-
removeChildImpl
- 返回:
- index对应的child
-
isInlinable
public final boolean isInlinable()task是否支持内联 -
getControlFlowOptions
public final int getControlFlowOptions()获取任务的控制流标记位 -
exportControlFlowOptions
public final void exportControlFlowOptions()将task上的临时控制标记写回到flags中 -
setChildCancelToken
设置子节点的取消令牌 -
unsetChildCancelToken
删除子节点的取消令牌 -
stop
停止目标任务 -
resetForRestart
重置目标任务 -
getGuard
-
setGuard
-
getFlags
public final int getFlags() -
setFlags
-