1

我有一个简单的 Android 应用程序,它从本地服务器上的 php 文件中读取一些 JSON 数据。它非常简单,直到大约一个小时前它工作正常。然而,在稍作休息后(我什至没有关闭我的电脑),它突然开始与似乎是内存泄漏的问题作斗争,尽管我不是这方面的专家。

我不确定为什么会突然发生这种情况,因为我没有更改任何代码。但是当我运行该应用程序时,我的 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 回答