2011-05-13 30 views
2

我有一個應用程序需要在服務器之間來回傳輸數據,但速度並不令人滿意。主要部分是我從服務器接收和解析超過3g的JSON數據(約200個字符長),其最快執行任務的時間約爲5秒,但有時需要足夠長的時間才能超時(向上30秒)。我的服務器是一個rackspace雲服務器。如何讓我的android應用程序更快地接收/發送數據?

我以爲我是遵循最佳實踐,但它不能如此與這些種類的速度。我使用AsyncTask和全局HttpClient變量。

你能幫我找到更好的方法嗎?

我想過這些選項:

  • 使用TCP而不是HTTP
  • 對數據進行編碼,以儘量減少大小(不知道如何做到這一點的工作)

我對TCP的瞭解不多,但看起來好像會減少開銷。使用TCP而不是HTTP的優點和缺點是什麼?手機是否可行?

感謝

僅供參考 - 一旦我解決問題,我會接受的答案,這是最有幫助的。到目前爲止,我已經收到了一些真正偉大的答案


編輯:我做到了,這樣我可以看到的進展,因爲它下載和我已經注意到,它停留在0%長一段時間那麼它很快就會達到100% - 有沒有人有任何想法根據這個新的信息?這可能與我使用三星Epic和Froyo相關。

+0

您是否想過緩存數據? – Swift 2011-05-13 16:35:16

+0

我還沒有到那一點,它需要檢索數據並快​​速解析它 – Stephen 2011-05-14 17:24:37

+0

你主要是在處理網絡延遲這裏我懷疑 – 2011-05-16 20:37:40

回答

1

聽起來像你需要配置應用程序,以找出你的瓶頸在哪裏。你說你正在發送約200個字符的數據。這是微不足道的,我不知道壓縮或任何嚴格的數據相關如何將對這樣一個小數據集產生很大的影響。

我認爲你更可能有一些溝通問題,也許試圖建立一個新的連接爲每個傳輸或沿着這些線路,給你所有的開銷。

分析是解決您的問題的關鍵,其他任何事情都是在黑暗中拍攝的。

+0

我從來沒有用過traceview,但它似乎很有幫助,但有點複雜。它看起來像加載谷歌地圖,同時下載我的數據是有某種效果,所以這是肯定有幫助的瞭解。 – Stephen 2011-05-14 17:28:04

2

TCP只是一個較低級別的HTTP,如果您確實需要性能,那麼TCP就是您應該使用的那個。 HTTP更容易開發,因爲有更多的支持和更容易實現的開發人員,它包裝了很多東西,所以你不必自己實現它們。你的情況的開銷不應該那麼大。

至於JSON數據。檢查其服藥時間長,正常的JSON庫的Java已經是該死的慢到這裏看看

http://www.cowtowncoder.com/blog/archives/2009/09/entry_326.html

調試,看看是否是這種情況。如果它的json解析速度,我建議你使用gson庫。它更乾淨,易於實施,速度更快。

+0

謝謝,我一直在使用JSON.org。爲什麼會推薦gson而不是Jackson?它看起來像傑克遜是你鏈接到 – Stephen 2011-05-13 17:38:15

+0

的圖表上最快的那個,這也是我最初想到的,但是接下來我在第二部分閱讀了這個內容:「而且的確,結果看起來似乎很熟悉(例如, )。考慮到「越大越好」的方面 - 價值衡量,「tps」,是每秒讀取,寫入或讀取 - 修改 - 寫入的文件數量 - 從最慢(google-gson)到最快(Jackson)的差異是實在的數量級。「 – Stephen 2011-05-13 23:54:21

+0

看起來我錯了......我也這麼認爲=。=刪除了評論。抱歉。反正繼承人的最新結果..我還沒有嘗試過傑克遜它不是默認庫是嗎?默認的一個是我的方式很慢.. http://www.cowtowncoder.com/perf/json-bind-2011-01-04/ heres最新的結果。 – Rejinderi 2011-05-14 00:41:48

4

嘗試使用GZIP壓縮正在發送的數據。注意一個代碼完整的例子,但它應該讓你在正確的道路上。

Rejinderi是對的; GSON岩石。

HttpGet getRequest = new HttpGet(url); 
getRequest.addHeader("Accept-Encoding", "gzip"); 


InputStream instream = response.getEntity().getContent(); 
Header contentEncoding = response.getFirstHeader("Content-Encoding"); 
if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) { 
    instream = new GZIPInputStream(instream); 
} 
+0

有什麼辦法使用gzip與TCP連接? – Stephen 2011-05-13 17:36:20

+0

我不知道。而不是HttpGet,你在用什麼? – 2011-05-13 17:46:08

+0

HttpPost - 我現在只通過字符串 – Stephen 2011-05-13 19:17:44

相關問題