内存在哪里泄漏?

时间:2018-10-25 08:27:59

标签: java android loops android-asynctask garbage-collection

我正在尝试下载页面的源代码。但是,当我运行代码时,它将永久运行,并且日志将永远显示类似的内容。

  

GC_FOR_ALLOC释放274K,释放13%释放6863K / 7815K,暂停0ms

这是我的代码:

class downloadSource extends AsyncTask<String, Void, String>{

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
        String line = "";
        int x;
        try {
            URL url = new URL(params[0]);
            InputStream inputStream = url.openStream();
            InputStreamReader reader = new InputStreamReader(inputStream);
            x = reader.read();
            while (x != -1) {
                char c = (char) x;
                x = reader.read();
                line += c;

            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return line;
    }

我从OnCreate方法中这样称呼它:

    downloadSource task2=new downloadSource();
    String source = "";
    try {
         source = task2.execute("https://www.imdb.com/list/ls052283250/").get();
    } catch (ExecutionException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

请帮助我! 谢谢

1 个答案:

答案 0 :(得分:0)

您的问题可能与内存泄漏无关。正如Holger所述,虽然您读取流的方法效率低下,但这也不是您的主要问题。

尝试将以下行添加为onCreate的第一行:

System.setProperty("http.keepAlive", "false");

发生的事情是,没有设置此属性,您的连接保持活动状态,等待更多请求完成,并且仅在超时时返回。将其设置为false可以使其在请求完成后立即返回。为了更好地理解这个概念,请阅读以下答案:How to interpret "Connection: keep-alive, close"?

关于流读取效率低下,我建议您将实现更改为类似于以下代码的内容:

URL url = new URL(params[0]);
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
StringBuilder builder = new StringBuilder();
String current;
while ((current = reader.readLine()) != null) {
    builder.append(current);
}
line = builder.toString();
reader.close();