我正在编写一个简单的Android应用程序,它与谷歌应用程序引擎上托管的宁静网络服务进行对话。 Web服务是使用Restlet框架开发的。以下是我的环境的详细信息:
我在AndroidManifest.xml中放置了以下权限:
<uses-permission android:name="android.permission.INTERNET" />
首先,当我在本地开发服务器上开发Web服务时,我能够从我的Android应用程序的Restlet客户端访问此Web服务而没有任何问题。
几天前,我将我的服务上传到GAE的appspot,并使用这个新网址重新编译了我的Android应用程序。但是,这次我的应用似乎根本没有连接到这个Web服务。它尝试连接并阻塞大约一分钟左右,并在logcat中抛出此错误:
12-27 15:14:52.856: ERROR/MyActivity(362): Internal Connector Error (1002) - The calling thread timed out while waiting for a response to unblock it.
12-27 15:14:52.856: ERROR/MyActivity(362): at org.restlet.resource.ClientResource$1.invoke(ClientResource.java:1648)
12-27 15:14:52.856: ERROR/MyActivity(362): at $Proxy7.getAvailableItems(Native Method)
12-27 15:14:52.856: ERROR/MyActivity(362): at com.example.activities.MyActivity$1.run(MyActivity.java:94)
我在GAE上调用以下Web服务方法:
@Get
GetItemsResponse getAvailableItems(ItemCategory itemCategory);
此外,我在android端执行此操作以绑定到Web服务:
ClientResource clientResource = new ClientResource(myServiceUri);
return clientResource.wrap(ItemsResource.class);
请注意,基于appspot的Web服务运行正常。我可以从外面的浏览器访问该服务。它还正确地提供了一个.jsp文件,它是我的应用程序之战的一部分,我可以使用它。
另一方面,在Android应用程序尝试连接到此服务的时候,我甚至在appspot仪表板中看不到任何传入的请求日志。似乎因为某些原因,Android请求甚至没有达到GAE。
以下是我在android端进行Web服务调用的方法......
自从我将此服务移至appspot后,该线程始终返回上面提到的异常。
我在这里做错了吗?当我从appspot访问时,为什么对此服务的调用失败?如果您需要更多信息,请与我们联系。
-Kalyan Akella
答案 0 :(得分:1)
我在使用restlet 2.0.4和android 1.5时遇到了类似的问题。 一切都在本地运作良好,但是我在GAE中部署了同样的超时异常。
我将服务上的注释@Get更改为@Put并且它有效。 这解释了为什么服务从浏览器工作。 我不知道为什么在这种情况下@Get无法在GAE中使用已部署的应用程序...
答案 1 :(得分:1)
我遇到了同样的问题(也在GAE-&gt; Android上)
尝试使用org.restlet.ext.net作为您的http客户端。 在restlet.org上,您被告知要更改这样的客户:
Engine.getInstance().getRegisteredClients().add(new HttpClientHelper(null));
但是我发现除非你这样做,否则它不起作用:
Engine.getInstance().getRegisteredClients().clear();
Engine.getInstance().getRegisteredClients().add(new HttpClientHelper(null));
确保在构建路径上包含org.restlet.ext.net.jar,并确保您注册的HttpClientHelper实际上是org.restlet.ext.net.HttpClientHelper。
在使用restlet的最新快照时,这解决了我的问题,不确定它是否适用于以前的版本。
这也解决了我对restlet的一些其他问题: