我目前正在使用来自 Android 的 GAE。我有一个搜索操作,它对数据存储执行可能是长时间运行的查询(从 AsyncTask 调用)。在此过程仍在运行时,用户可以选择从应用程序中注销。如果没有取消此请求的选项,实际注销必须等到该过程完成并且控制权返回给客户端(正如我所说,这可能需要几秒钟)。
有没有办法在服务器运行时取消对 GAE 端点的调用并将控制权返回给客户端?谢谢。
ps
显然,仅取消 AsyncTask 是不够的。
我目前正在使用来自 Android 的 GAE。我有一个搜索操作,它对数据存储执行可能是长时间运行的查询(从 AsyncTask 调用)。在此过程仍在运行时,用户可以选择从应用程序中注销。如果没有取消此请求的选项,实际注销必须等到该过程完成并且控制权返回给客户端(正如我所说,这可能需要几秒钟)。
有没有办法在服务器运行时取消对 GAE 端点的调用并将控制权返回给客户端?谢谢。
ps
显然,仅取消 AsyncTask 是不够的。
不,Google Endpoints 使用 servlet,并且 servlet 没有(标准)方式告诉正在运行的请求取消它的工作。您将需要构建一些专有的东西。
例如:在服务器上长时间运行的进程中,您在它的主循环中检查用户是否仍然登录(通过数据存储或内存缓存中的标志)。如果此标志告诉您用户已注销,则您取消处理并返回。登录/注销过程也必须适当地设置此标志。
就个人而言,我将服务器通信放在服务中,这样无论用户做什么,请求都可以(通常)完成。在您的情况下,您可以让用户注销,同时让请求完成吗?
否则,我不知道如何干净地中断端点请求。不幸的是,实际的阻塞操作隐藏在端点(Google API 客户端库)代码中,并且我知道没有暴露取消操作。
当您编写取消任务时 - AsyncTask.cancel(boolean mayInterruptIfRunning) - 是不够的,那是因为您已经尝试过它并且它不会中断阻塞的操作。