我的代码用于向多个用户发送电子邮件。用户将单击发送按钮,然后调用 rpc。现在,如果用户单击取消按钮。正在进行的 rpc 应该被取消。. 任何人都可以帮忙吗?
我google了很多,他们已经介绍了Request Builder的概念。但我没有得到任何完美的想法。
使您的异步方法返回 aRequest
而不是,void
以便您可以调用cancel()
它。
出于同样的原因,异步方法没有返回类型。他们通常返回无效。如果您希望更好地控制待处理请求的状态,请改为返回 Request。
仅供参考,您也可以RequestBuilder
用作返回类型,然后您必须send()
自己调用该方法(在可能自定义请求之后,例如添加标头)以实际向服务器发出请求。
当然,如果您需要告诉服务器中止处理,则必须进行另一个 RPC 调用。
该请求是异步的,因此客户端可以做任何它想做的事情。您需要做的就是添加一个标志以指示应该取消请求,然后更改onSuccess
检查标志的方法,如果已设置则不执行任何操作。
您应该在每次提出请求时清除requestCancelled
标志 - 否则在第一个请求被取消后,您将无法再提出另一个......
例如
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
}
}
显然,这是很多工作。你有没有考虑过:
我完全理解你的用户。没有人愿意等待 15 秒。
没有“杀死”请求的标准方法,因为没有办法知道你的服务器/数据存储在哪里实现它。除非您处理的流程可以放入可以回滚的单个事务中,否则您将不得不实现自己的逻辑。例如,如果您要求服务器保存一个实体,您将不得不告诉服务器再次保存该实体,但这次不做任何更改。
另外,请再次考虑您的用例。为什么用户想要终止请求?可能他只是想去应用程序中的另一个地方。那么就不需要杀死请求了:当响应到达时,检查用户是否还在原地耐心等待。如果没有,请不要执行 onSuccess()。