Android的Restlet:内部连接器错误(1002) - 调用线程超时错误

时间:2011-01-01 11:55:43

标签: java android google-app-engine restlet

我正在编写一个简单的Android应用程序,它与谷歌应用程序引擎上托管的宁静网络服务进行对话。 Web服务是使用Restlet框架开发的。以下是我的环境的详细信息:

  • 服务器端:用于GAE的Restlet v2.0.3
  • Android Side:Restlet v2.0.3 for
  • Android Android:v2.2 API Level 8

我在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服务调用的方法......

  1. 对具有默认优先级的线程进行Web服务调用。
  2. 这个帖子产生了&amp;在我的主要活动的 onStart 方法内部开始。
  3. 与此同时,我在UI线程上渲染了一个进度对话框。
  4. 一旦线程收到来自Web服务的任何响应,它就会使用特定值更新 SharedPreferences 。如果调用返回任何错误,它会记录此错误,然后使用默认值更新 SharedPreferences
  5. 这会导致我的 SharedPreferences 侦听器被调用。然后取消进度对话框并呈现主UI。
  6. 自从我将此服务移至appspot后,该线程始终返回上面提到的异常。

    我在这里做错了吗?当我从appspot访问时,为什么对此服务的调用失败?如果您需要更多信息,请与我们联系。

    -Kalyan Akella

2 个答案:

答案 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的一些其他问题:

  • 使用HTTPS时出现1001错误
  • 发布数据时随机发生错误