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 秒。

有什么办法可以提高效率吗?

4

2 回答 2

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();
    }
}

此代码将使用 listData 中的所有元素构建一个 JSONArray(它应该是一个字符串列表)

现在您可以使用以下方法轻松地将 JSONArray 转换为字符串

newArray.toString()

现在您可以通过网络发送此 JSON 字符串,并且可以轻松地以任何服务器端语言反序列化 JSON 对象。

至于 Gzip 压缩,你可能想看看这个链接

这是一个关于 SO 的问题,关于
在 Java 中使用 HTTPClient 在 android GZip POST 请求中通过 HTTP 发送 GZip 压缩数据

于 2013-03-11T13:20:36.663 回答
0

我同意@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();
}
于 2013-03-11T13:31:03.770 回答