Activity失去Pepper机器人焦点用onRobotFocusLost回调
声明:本媒体部分图片、文章来源于网络
版权归原作者所有,如有侵权,请与我联系删除。
失去机器人焦点
Activity失去机器人焦点, onRobotFocusLost 回调被每个注册在Activity上的RobotLifecycleCallbacks 调用:
void onRobotFocusLost();
Warning
这个回调在后台线程中运行, 所以你无法直接在其中操作UI组件. 请参阅返回UI线程 以在UI线程中运行你的代码.
有关何时 Activity 可以失去焦点的更多信息, 请参阅
对于actions的影响
调用此回调时, Activity 在重新获得机器人焦点之前,不能在Pepper上运行actions:
// This will fail if robot focus is lost.
say.run();
此外,如果 onRobotFocusLost 在操作正在运行时调用,则操作执行将停止并将引发异常:
// This will raise an exception.
say.run();
say.async().run().thenConsume(future -> {
if (future.isSuccess()) {
// This will not be called.
} else if (future.hasError()) {
// This will be called.
}
});
因为Listeners可以在没有PEPER\\\\机器人焦点的情况下被触发,所以应当删除onRobotFocusLost 回调下所有的Listeners:
// Remove listeners from LookAt.
if (lookAt != null) {
lookAt.removeAllOnPolicyChangedListeners();
}
对服务 services的影响
当机器人焦点丢失时,机器人服务不会受到影响.
这意味着与services创建的Future将继续执行,并且仍将触发与任何服务关联的Listeners :
// The Future will continue its execution.
Future
因为可以在没有机器人焦点的情况下触发Listeners, 你应该删除所有在 onRobotFocusLost 回调中的service listeners:
// Remove listeners from HumanAwareness.
if (humanAwareness != null) {
humanAwareness.removeAllOnHumansAroundChangedListeners();
}
如果一个 service listener 没有在onRobotFocusLost 回调中移除, 则会在所有应用程序生命周期(lifecycle)内触发该Listener.