【问题标题】:Does Pepper QISDK sync calls ensure a result?Pepper QISDK 同步调用是否确保结果?
【发布时间】:2020-08-03 12:53:57
【问题描述】:

QiSDK 文档可以理解,async()Future<T> 的调用具有结果状态。

例如

var goto = GoToBuilder..
var operation = goto.async().run().thenConsume {    
//if(it.isSuccess or it.hasError()) etc. statuses are available
}
//These statuses are also available in the $operation variable afterwards
if(operation.hasError()) {...}

但是当我们调用操作sync()

例如只是

var goto = GoToBuilder...
goto.run()

是否确保操作成功完成

它是否还会锁定current Thread 或者我们应该了解sync() 调用的哪些信息?因为文档说,最佳实践是始终使用async(),但如果我不希望 Pepper 为操作创建 new Thread 并与代码一起处理它们怎么办。

【问题讨论】:

标签: android kotlin robot pepper


【解决方案1】:

是否保证操作成功完成?

不,是否使用async() 对成功机会没有影响;改变的是,如果发生错误:

  • 使用.async(),未来将以错误结束(.hasError().getErrorMessage() ...)
  • 使用同步调用时,调用将引发异常(因此您可以使用 try/catch 对其进行包装)

它是否还会锁定当前线程,或者我们应该知道关于 sync() 调用的哪些信息?

是的,同步调用会阻塞当前线程,直到操作完成(成功、取消或失败),这意味着你永远不应该在 android 主线程(UI 线程)中这样做,否则你会得到一个NetworkOnUIThread 异常。

请注意,并非所有调用都会自行完成;例如,Chat 对象上的 chat.run() 将“永远”运行,也就是说,直到它被取消或引发错误。这是.sync() 有用的另一种情况,因为您将获得一个可以取消以停止聊天的未来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多