【问题标题】:Memory leak with Android app?Android应用程序的内存泄漏?
【发布时间】:2013-01-22 06:14:49
【问题描述】:

我有一个简单的 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 数据根本不是很大。

感谢您的建议。

【问题讨论】:

  • 尝试在异步任务中运行你的 http 调用和 json 解析
  • 好的,谢谢。我对android开发很陌生,所以我想我有一些阅读要做。这似乎很奇怪,当它工作得非常好时突然开始发生这种情况。
  • 首先尝试使用单独的线程,或者更好的是异步任务。其次,使用 finally 块并关闭那里的输入流是一种更好的方法。第三,内存泄漏可能在代码中的其他地方,所以也要看看...
  • 你多久调用一次这个方法?
  • 只有一次。我已将问题缩小到 While((line = reader.readline() 行。我认为“行”字符串可能太长了?

标签: android json memory-leaks


【解决方案1】:
BufferedReader reader = new BufferedReader(new InputStreamReader(
            is, "utf-8"), 8);

您已分配 8 字节的缓冲区大小。那是非常小的。除非您真的知道自己在做什么,否则只需将默认大小与替代的单参数构造函数一起使用:

public BufferedReader(Reader in)

【讨论】:

    【解决方案2】:

    好吧,我将“While”循环更改为此,性能显着提高:

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

    它仍然比我想要的慢,但至少我朝着正确的方向前进。我会再努力一些。谢谢大家。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-01
      • 2016-11-23
      • 2018-12-30
      相关资源
      最近更新 更多