我正在使用Spring构建REST应用程序。我正在以POJO的方式做这件事。现在我想处理花费太长时间的GET请求(假设因为用户连接非常糟糕)。我可以做些什么来处理这个问题(在Spring中),也许是在5000ms之后取消请求?
我的方法:
所以我猜需要某种超时。在我的google-tour中,我发现有一个HttpComponentsClientHttpRequestFactory和一个所谓的setConnectTimeout()函数。我对此进行了测试,但我无法处理抛出的异常,因为它的内部深处"它会作为AsyncTask的致命异常传递出去。所以我失败了。
什么是最佳做法?有什么想法吗?
修改: Spring已设置好,所以请只使用Spring解决方案。
修改: 根据我的研究,这是不可能的。甚至@ Spring论坛还没有答案:http://forum.springsource.org/showthread.php?135656-How-can-I-handle-GET-requests-that-are-taking-to-long
答案 0 :(得分:2)
首先,不要使用AsyncTask来执行网络请求,因为如果更改设备的方向,则会销毁Activity并重新创建,但AsyncTask会对已销毁的Activity保持引用并导致一些内存泄漏
使用服务代替。我建议你使用RoboSpice。它是一个可以使用POJO和Spring轻松发出REST请求的库。
如果您对自动本地&远程数据持久性管理,您可以使用RestDroid来处理(也使用POJO)。
两个库都使用RequestListeners来管理您正在谈论的案例。当您的请求失败时,将通知UI。
答案 1 :(得分:0)
为什么不采取更简单的方法, 尝试这个代码,你会得到一个更明确的例外:
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, 5000);
HttpConnectionParams.setSoTimeout(httpParameters, 10000);
HttpClient client = new DefaultHttpClient(httpParameters);
HttpGet request = new HttpGet(url);
HttpResponse response = client.execute(request);