编辑:我认为解析xml的代码中存在逻辑错误,因此如果写得正确,不应该有任何泄漏。
所以我在我的项目中添加了一个AsyncTask类,我之前写过这个类用于快速测试,但它导致了内存泄漏错误。
我确信它是负责任的,因为当我删除它时,泄漏问题就会消失。
这是堆转储文件(已转换)http://www7.zippyshare.com/v/83628026/file.html
package com.example.xmldl;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.os.AsyncTask;
import android.util.Xml;
public class Dlxml extends AsyncTask<String, Void, Void> {
//adding or removing Override didnt matter just to let you know
InputStream istream = null;
protected Void doInBackground(String... url){
try {
downloadXml(url[0]);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
private void downloadXml(String url) throws IOException {
try {
URL mUrl = new URL(url);
HttpURLConnection urlConnection = (HttpURLConnection) mUrl.openConnection();
istream = urlConnection.getInputStream();
XmlPullParser parser = Xml.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(istream, null);
parser.nextTag();
parser.require(XmlPullParser.START_TAG, null, "resources");
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() == XmlPullParser.TEXT) {
parser.nextTag();
}
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
istream.close();
}
}
}
答案 0 :(得分:0)
我不相信你正在关闭你的输入流:
private void downloadXml(String url) throws IOException {
try {
URL mUrl = new URL(url);
HttpURLConnection urlConnection = (HttpURLConnection) mUrl.openConnection();
InputStream istream = urlConnection.getInputStream();
XmlPullParser parser = Xml.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(istream, null);
parser.nextTag();
parser.require(XmlPullParser.START_TAG, null, "resources");
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() == XmlPullParser.TEXT) {
parser.nextTag();
}
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
}
// dont forget to close the input stream!
istream.close();
} catch (IOException e) {
//error closing istream
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
}
}
答案 1 :(得分:0)
在此代码中,我看不到可能的内存泄漏问题。所以它必须包含在此代码中。因为我不知道XmlPullParser可能就在那里。无论如何,输入流应该在finally分支处关闭,因为你必须修改你的代码
finally {
istream.close();
}
不好:)
finally {
if(istream != null){
istream.close();
}
}
更好:)
答案 2 :(得分:0)
在大多数情况下,我在Android中发生内存泄漏,它来自线程问题。所以,我首先可以问你如何调用这个类(Dlxml,从AsyncTask扩展)。确保你没有使用匿名变量,例如“new Dlxml()。execute()”,因为Android的垃圾收集器可能需要很长时间才能检测到线程不再有用(如果你正在使用加载器)列表,它可以产生很多泄漏)。我建议你在实现并行处理之前检查这两点:
重要的事情:我发现你已经使用过AsyncTask,并且只在后台做了很多事情。这些事情会改变观点吗?您可以在 doInBackground 上进行下载,然后在 onPostExecute 中更改视图。
您也可以对以下链接感兴趣: