Mémoire insuffisante lors de l'allocation de curseurs
J'ai un problème de mémoire que je ne peux pas comprendre. J'ai une classe qui ne tous mes base de données de récupération de travail. L'erreur que j'ai est le suivant:
android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=733 (# cursors opened by this proc=733)
L'erreur d'allocation de mémoire se produit lorsque je fais ceci:
mDatabaseInterface.getGraphForLevel(level);
Je sais que c'est une fuite parce que j'ai appeler cette méthode à toutes les 2,5 secondes environ, et les 5 ou 6 premiers appels passer à travers facilement. Maintenant, voici les méthodes de mon DatabaseInterface classe:
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));
}
J'ai beaucoup de méthodes qui s'appellent les uns les autres, mais je sais que c'est pas un problème de récursivité parce que cette classe fonctionne dans une autre application. Ma principale question est pourquoi ne pas cursor.close()
libérer le curseur? Si je fais quelque chose comme:
cursor = mDatabase.query(...);
cursor.moveToNext();
Node node = new Node(cursor.getInt());
cursor.close();
Est le curseur conservé dans ce cas?
Merci d'avance.
source d'informationauteur chopchop
Vous devez vous connecter pour publier un commentaire.
L'appel à
cursor.close()
devrait être dans unfinally
bloc dans le cas où une exception est levée pendant que vous êtes à parcourir.L'une des raisons de la survenue de l'erreur de Mémoire est
you are not closing your cursor
.Que je peux voir, vous appelez
cursor.close()
mais est-ce le bon endroit où vous devez appeler cette méthode ou vérifier si vous devez la fermer sur un autre lieu.EDIT:
Si votre activité est
managing your Cursor
vous pouvez envisager d'arrêter de le gérer et de clôture de tout dans leonPause
méthode, et dansonResume
de tout ouvrir et fillData une fois de plus.