0

たとえば、私のタブレットには 10MB のデータが保存されています。データはリスト構造になっています。リストの各エントリは約 3500 バイトです。

現在、次のコードを使用して毎回 1 つのエントリを送信しています。

    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 オブジェクトを構築する利点は、すべてのオブジェクトを個別に送信するのではなく、1 つの要求として送信できることです。これにより、毎回新しい接続を確立する際の待ち時間がなくなります。

// 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 圧縮については、このリンクを参照してください。

これは、 JavaでHTTPClientを使用したAndroid GZip POSTリクエストでHTTP経由でGZip圧縮データを送信することに関するSOに関する質問です

于 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 に答える