我正在尝试下载页面的源代码。但是,当我运行代码时,它将永久运行,并且日志将永远显示类似的内容。
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();
}
请帮助我! 谢谢
答案 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();