2013-03-11 48 views
0

例如我的平板電腦中存儲有10MB數據。數據有一個列表結構。列表中的每個條目都是大約3500字節。如何減少發送數據到遠程服務器的時間?

目前,我每次發送用以下代碼一個條目:

HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost(ipport+ phpHandler); 
    HttpResponse response = null; 

    try { 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "utf-8")); 
     response = httpclient.execute(httppost); 
    } catch (UnsupportedEncodingException e) { 
    } catch (ClientProtocolException e) { 
    } catch (IOException e) { 
    } 

但發送此10MB的數據,花了很長的時間。每次發送一個條目大約需要1秒。

提高效率的任何解決方案?

+1

壓縮它,例如用gzip – 2013-03-11 13:17:03

回答

1

您可以構建包含所有實體的JSON字符串對象,然後使用gzip或任何其他壓縮方案對其進行壓縮。

構建JSON對象的好處是您可以將所有對象作爲一個請求發送,而不是單獨發送。這將消除每次建立新連接的延遲。

// your data list = listData 
JSONArray newArray = new JSONArray(); 
for (int i = 0, lsize = listData.size(); i < lsize; i++) { 
    try { 
     newArray.put(i, listData.get(i)); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 

此代碼將構建一個JSONArray用的listData所有元素(它應該是一個字符串列表)

現在你可以很容易地轉換JSONArray使用

newArray.toString() 
字符串

現在,您可以通過網絡發送此JSON字符串,並且可以使用任何服務器端語言輕鬆反序列化JSON對象。

至於Gzip壓縮,你可能想看看這個link

下面是關於Android的
GZip POST request with HTTPClient in Java

+0

聽起來很有趣!你能在這裏顯示一些代碼嗎?我不熟悉JSON以及如何從Java調用gzip。 – JackWM 2013-03-11 13:23:14

0

通過HTTP發送gzip壓縮的數據,我用的答案商定SO問題@Ahmed。你最好使用json字符串對象,然後使用gzip libray進行壓縮。

對於JSON有很多有用的教程。下面的鏈接是真正有用的

http://www.vogella.com/articles/AndroidJSON/article.html

在這裏你可以看到簡單的方式來寫JSON

public void writeJSON() { 
    JSONObject object = new JSONObject(); 
    try { 
    object.put("name", "Jack Hack"); 
    object.put("score", new Integer(200)); 
    object.put("current", new Double(152.32)); 
    object.put("nickname", "Hacker"); 
    } catch (JSONException e) { 
    e.printStackTrace(); 
    } 
} 

,並壓縮和解壓縮使用gzip我在這裏從答案添加一些示例代碼https://stackoverflow.com/a/6718707/931982

public static byte[] compress(String string) throws IOException { 
    ByteArrayOutputStream os = new ByteArrayOutputStream(string.length()); 
    GZIPOutputStream gos = new GZIPOutputStream(os); 
    gos.write(string.getBytes()); 
    gos.close(); 
    byte[] compressed = os.toByteArray(); 
    os.close(); 
    return compressed; 
} 

public static String decompress(byte[] compressed) throws IOException { 
    final int BUFFER_SIZE = 32; 
    ByteArrayInputStream is = new ByteArrayInputStream(compressed); 
    GZIPInputStream gis = new GZIPInputStream(is, BUFFER_SIZE); 
    StringBuilder string = new StringBuilder(); 
    byte[] data = new byte[BUFFER_SIZE]; 
    int bytesRead; 
    while ((bytesRead = gis.read(data)) != -1) { 
     string.append(new String(data, 0, bytesRead)); 
    } 
    gis.close(); 
    is.close(); 
    return string.toString(); 
} 
+1

HTTP本身支持請求/響應主體的GZip作爲其規範的一部分。使用HTTP客戶端,可以激活功能,如http://hc.apache.org/httpcomponents-client-ga/examples.html上的文檔示例所示。這種機制還允許全身流式傳輸,這可以減少通信的內存佔用。 – GPI 2013-03-11 13:38:22

+0

原生mecanism也處理正確的字符串到字節轉換,遵循HTTP頭的內容和規範,給定的示例可能無法做到(因爲'string.getBytes'和'new String(byte [])'將依賴於默認的JVM編碼,而轉換應該根據HTTP頭信息完成)。 – GPI 2013-03-11 13:49:36

相關問題