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

相关问题