0

我目前正在使用来自Android的GAE。我有一个搜索操作,可以在数据存储上执行长时间运行的查询(从AsyncTask调用)。用户可以选择在此过程仍在运行时从应用程序注销。如果没有取消此请求的选项,则实际注销必须等到该过程完成并且控制权返回给客户端(正如我所说,这可能需要几秒钟)。取消谷歌应用程序引擎端点请求

有没有办法在服务器运行时取消对GAE端点的调用并将控制权返回给客户端?谢谢。

p.s.
显然,仅取消AsyncTask是不够的。

回答

0

就我个人而言,我把服务器通信放在一个服务中,这样无论用户做什么,请求都可以(通常)完成。在你的情况下,你可以让用户注销,但也让请求完成?

否则,我不知道如何干净地中断端点请求。不幸的是,实际的阻止操作被隐藏在端点(Google API客户端库)代码中,并且我没有发现任何我知道的取消操作。

当您编写取消任务 - AsyncTask.cancel(boolean mayInterruptIfRunning) - 是不够的,是因为您已经尝试过它并且它不会中断被阻止的操作。

+0

是im调用AsyncTask.cancel()但由于AsyncTask仍然与服务器通信,取消不是立即。它正在等待来自服务器的响应。 – AsafK

+0

哦,好的,我不确定'mayInterrup'参数是什么 - 我希望它可能会杀死线程。 – Tom

+0

你是什么意思你“把服务器通讯服务”? – AsafK

0

不,Google Endpoints使用servlet和servlet没有(标准)方式告诉正在运行的请求取消它的工作。你将需要建立一些专有的东西。

例如:在服务器上长时间运行的进程中,在主循环中检查用户是否仍然登录(通过数据存储或memcache中的标志)。如果此标志告诉您用户已注销,则取消处理并返回。此外,登录/注销过程必须适当地设置此标志。

+0

这是一个耻辱......你的方式,我现在有一种感觉是唯一的方式,真的很尴尬。我认真思考如何离开它。 – AsafK

+0

Http以请求 - 回复的方式工作。一旦收到完整的请求,服务器开始处理它,恕我直言,没有办法告诉服务器取消它。 AFAIK对于所有HTTP服务器,Java或任何其他语言都是如此。 –