2013-11-20 31 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

相關問題