我的代码用于向多个用户发送电子邮件。用户点击发送按钮,将调用rpc。现在,如果用户点击取消按钮。应该取消正在进行的rpc。 。有人可以帮忙吗?
我google了很多,他们介绍了Request Builder的概念。但我没有得到任何完美的想法。
答案 0 :(得分:7)
让异步方法返回Request
而不是void
,以便您可以在其上调用cancel()
。
出于同样的原因,异步方法没有返回类型;他们通常会失效。如果您希望更多地控制待处理请求的状态,请返回Request。
仅供参考,您也可以使用RequestBuilder
作为返回类型,然后您必须自己调用send()
方法(在可能自定义请求之后,例如添加标题)以实际制作请求服务器。
当然,如果你需要告诉服务器中止处理,你将不得不再进行一次RPC调用。
答案 1 :(得分:1)
请求是异步的,因此客户端可以做任何想做的事情。
您需要做的就是添加一个标志以指示应该取消该请求,然后更改onSuccess
方法以检查该标志,如果已设置则不执行任何操作。
每次提出请求时都应清除requestCancelled
标记 - 否则在取消第一个请求后,您将无法再生成另一个请求...
e.g。
boolean requestCancelled = false;
void onSuccess(...)
{
if (!requestCancelled) {
// actual response handing code
}
}
如果你真的想在服务器端取消请求,那就复杂得多了。您可以通过发送第二个请求来执行此操作 - 其中一个请求是取消请求。 为了使这项工作,“取消请求”必须在“电子邮件请求”可以读取的某个地方设置一个字段。 “电子邮件请求”需要检查是否已设置“取消字段”。
// server side Impl
void cancelRequest()
{
// You need to implement this class and ensure it really is a singleton
// and thread safe.
RequestStatusSingleton.setCancelled(true);
}
void serverSideEmailFunc()
{
while(modeEmailAddrs && ! RequestStatusSingleton.getCancelled()) {
// get next address and send email
}
}
显然这是一项很多工作。你考虑过了吗?
答案 2 :(得分:0)
我完全理解您的用户。没有人愿意等待15秒。
没有标准方法可以“终止”请求,因为无法知道服务器/数据存储区在实现它的位置。除非您处理可以放在可以回滚的单个事务中的进程,否则您将必须实现自己的逻辑。例如,如果您要求服务器保存实体,则必须告诉服务器再次保存此实体,但这次没有更改。
另外,再想想你的用例。为什么用户想杀死请求?可能他只是想去应用程序中的另一个地方。然后没有必要终止请求:当响应到达时,检查用户是否仍在耐心等待的同一个地方。如果没有,请不要执行onSuccess()。