我正在做一个字典应用程序,我正在使用this xml url。
解析这个url时,我得到了OutOfMemoryError。任何人都可以告诉我它为什么会出现以及解决这个问题的正确方法是什么?请给我一些其他想法做词典App。
这是我用于此XML解析的代码:
public class MainActivity extends Activity {
TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
text = (TextView) findViewById(R.id.textView1);
try {
parse();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
void parse() throws IOException, XmlPullParserException {
URL url = new URL("http://dumps.wikimedia.org/enwiktionary/latest/enwiktionary-latest-abstract.xml");
// Create a new instance of a PullParserFactory that can be used to
// create XML pull parsers
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// Specifies that the parser produced by this factory will provide
// support for XML namespaces. By default the value of this is set to
// false.
factory.setNamespaceAware(true);
// Creates a new instance of a XML Pull Parser using the currently
// configured factory features
XmlPullParser xpp = factory.newPullParser();
// Sets the input stream the parser is going to process. This call
// resets the parser state and sets the event type to the initial value
// START_DOCUMENT.
xpp.setInput(url.openStream(), null);
// Returns the type of the current event (START_TAG, END_TAG, TEXT,
// etc.)
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
// text.append(xpp.getName());
} else if (eventType == XmlPullParser.TEXT) {
text.append(xpp.getText());
} else if (eventType == XmlPullParser.END_TAG) {
// text.append(xpp.getName());
}
eventType = xpp.next();
}
}
}
请帮忙......谢谢
答案 0 :(得分:3)
嗯,“为什么”的答案很简单:文件大小为1.7G,并且您尝试将其全部存储在内存中。
要解决此问题,您必须更改工作方式:不是解析整个文件,而是将其存储在服务器上的数据库中,并在需要单词时查询服务器。您还可以尝试仅在应用程序中存储单词(在压缩结构中,如DAWG),并在用户请求时从服务器“即时”获取定义。
答案 1 :(得分:0)
如果您的最低版本的sdk为11或更高,请尝试
将以下内容添加到清单
中的应用标记中android:largeHeap="true"
有些人说这不是最好的方式,但是,在我的应用程序中它完美运行,所以我建议你。
希望它会对你有所帮助。