Out of Memory bei der Zuteilung von Cursor
Ich habe ein Speicher-problem, dass ich nicht herausfinden können. Ich habe eine Klasse, die nicht alle meiner Datenbank abrufen arbeiten. Die Fehler, die ich habe ist folgende:
android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=733 (# cursors opened by this proc=733)
Den memory allocation-Fehler tritt auf, wenn ich dies tun:
mDatabaseInterface.getGraphForLevel(level);
Ich weiß, es ist ein Leck, da ich diese Methode aufrufen, alle 2,5 Sekunden etwa, und die 5 oder 6 ersten Anrufe gehen problemlos durch. Nun, hier sind die Methoden in meinem DatabaseInterface Klasse:
public Graph getGraphForLevel(Level level) {
//get the nodes
ArrayList<Node> nodes = new ArrayList<Node>(Arrays.asList(this.getNodesWithLevel(level)));
//get the edges
ArrayList<Edge> edges = new ArrayList<Edge>(Arrays.asList(this.getEdgesWithNodes(nodes)));
return new Graph(nodes, edges);
}
public Node[] getNodesWithLevel(Level level) {
List<Node> l = new ArrayList<Node>();
Cursor cursor = mDatabase.query("nodes", null,
"level = " + wrapSql(String.valueOf(level.getId())), null, null, null, null);
while (cursor.moveToNext()) {
l.add(parseNodeFromCursor(cursor));
}
cursor.close();
return l.toArray(new Node[l.size()]);
}
private Node parseNodeFromCursor(Cursor cursor) {
Level l = getLevelWithId(cursor.getInt(2));
return new Node(cursor.getInt(0), cursor.getString(1), l,
cursor.getInt(4), cursor.getInt(5));
}
Ich habe eine Menge von Methoden, die einander aufrufen, aber ich weiß, es ist keine Rekursion problem, weil diese Klasse funktioniert in einer anderen app. Meine wichtigste Frage ist, warum nicht cursor.close()
befreien Sie den cursor? Wenn ich so etwas mache:
cursor = mDatabase.query(...);
cursor.moveToNext();
Node node = new Node(cursor.getInt());
cursor.close();
Ist der cursor bleibt in diesem Fall?
Vielen Dank im Voraus.
InformationsquelleAutor der Frage chopchop | 2012-09-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Aufruf
cursor.close()
sollte in einemfinally
block im Fall einer exception wird geworfen, während Sie Durchlaufen ihn.InformationsquelleAutor der Antwort Graham Borland
Einer der Gründe für die auftretenden Out-of-Memory-Fehler ist
you are not closing your cursor
.Wie ich sehen kann, Sie ruft
cursor.close()
aber ist es der richtige Ort, wo sollten Sie diese Methode aufrufen, oder prüfen Sie, ob Sie sollte, schließen Sie es an eine andere Stelle.EDIT:
Wenn Ihre Tätigkeit
managing your Cursor
können Sie erwägen, stoppen, verwalten und schließen alles, was in deronPause
Methode, und inonResume
öffnen alles und fillData wieder.InformationsquelleAutor der Antwort Shrikant