2013-11-20 27 views
0

我正在使用HTTP rest API,我需要能够注册才能接收异步事件通知。使用Android流式传输HTTP连接可能吗?

应用程序首先通过向API发送POST请求来为事件 传递建立事件通道。事件通道被建立为流式HTTP连接。这个持续连接是使用Comet语义创建的。

是否可以使用Java/Android设置长时间运行的HTTP连接?

我相信某些类型的Socket是必需的,它允许您发布数据。

编辑 我创建的应用程序将在一个总是有以太网连接和主电源的设备上。所以电源/连接问题并不是真正的问题。

回答

0

IMO - 彗星是不适合通过4G的低功耗器件消耗...

这你是消费REST API还没有准备好移动,直到它与内部代理/网关升级到PUSH伸手协议传递给IOS/Android客户端,这些客户端喜欢通过比Comet更适合的其他API /协议进行事件通知。

如果您必须使用api并同时到达android,那么请考虑为您的Android用户构建一个代理,以将Comet调用转换为android推送消息。

你可能会看到像Parse.com这样的东西,因为它们有很棒的原生REST和推送的android端。即在Heroko/AWS节点上进行代理并将原生android推送发送给客户端并不是什么大不了的事情。

--edit android code

+0

请参阅我的编辑...不幸的是,我可以'更改API,而不必修改响应,然后传递到设备。 – Lunar

+1

我的猜测是你用HttpUrlConn比用Apache HTTP客户端运气要好。您可能需要花一点时间阅读android源代码AOSP,以便真正了解它在标题=“Transfer-Encoding:chunked”中的作用。请参阅我编辑的Android代码,以使用“分块” –

0

是的,这是可能的,你可以例如在Service中实现这种连接,即使应用程序未运行,该连接也会运行。如果需要,您还可以请求权限以防止设备/ CPU休眠(例如WAKE_LOCk)。

然后使用什么样的连接(通过HttpUrlConnection或Apache HttpClient,GET,POST等)取决于您和您的需求。然而,要特别注意这个警告的文档:

注意:一种服务,它的托管过程中 服务的主线程中运行不创建自己的线程,并在一个单独的不运行 过程(除非另有说明)。这意味着,如果您的服务将执行任何CPU密集型工作或阻止操作(如MP3播放或联网) ,则应在服务内创建一个新线程 以完成此项工作。

如果超时是一个问题,您可能需要将它们设置为无限值,例如,与setReadTimeout(0)docs,尽管连接不应默认超时)或其他超时配置。

另外请记住,长时间运行(网络)操作可以耗尽电池真的很快。

+0

我明白,一个服务是长期运行的,这个问题是连接没有保持活着.. HttpURLConnection类例如不留活足够长的时间来充当传入响应的监听器。幸运的是,电池耗尽不是问题:) – Lunar

+0

那只是时间问题呢?查看编辑。 – Blacklight

相关问题