1

ローカルサーバー上のphpファイルからJSONデータを読み取る単純なAndroidアプリがあります。それは非常に単純で、約1時間前までは正常に機能していました。しかし、少し休憩した後(PCの電源を切らなかった)、私はこのテーマの専門家ではありませんが、突然メモリリークのように見えることに苦労しています。

コードを変更しなかったので、なぜ突然これが起こっているのかわかりません。しかし、アプリを実行すると、logcatは次のようなメッセージでゆっくりといっぱいになり始めます。

「GC_CONCURRENTが解放され、910K、53%が解放された3167K /6727K.....」

アプリは最終的に実行されますが、待機してから約1〜2分後になります。とにかく、誰かが私のコードをチェックしたり、これが発生する原因を教えてくれるのではないかと思っていました。

public static JSONArray getJSONfromURL(String url) {

    // initialize
    InputStream is = null;
    JSONArray jArray = null;
    String result = "";

    // http post
    try {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url);
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();

    } catch (Exception e) {
        Log.e("log_tag", "Error in http connection " + e.toString());
    }

    // convert response to string
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "utf-8"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        result = sb.toString();

    } catch (Exception e) {
        Log.e("log_tag", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        jArray = new JSONArray(result);         
    } catch (JSONException e) {
        Log.e("log_tag", "Error parsing data " + e.toString());
    }

    return jArray;
}

JSONデータはそれほど大きくありません。

アドバイスありがとうございます。

4

2 に答える 2

2
BufferedReader reader = new BufferedReader(new InputStreamReader(
            is, "utf-8"), 8);

8バイトのバッファサイズを割り当てました。それは非常に小さいです。自分が何をしているのかを本当に理解していない限り、代替の単一引数コンストラクターでデフォルトのサイズを使用してください。

public BufferedReader(Reader in)
于 2013-01-21T22:14:49.257 に答える
0

'While'ループをこれに変更すると、パフォーマンスが劇的に向上しました。

int len;
char[] chars = new char[4*1024];
while((len = reader.read(chars))>=0) {
sb.append(chars, 0, len);
}

それでも私が望むよりは遅いですが、少なくとも私は正しい方向に向かっています。もう少し作業します。みんな、ありがとう。

于 2013-01-21T22:09:53.770 に答える