Tengo un problema de memoria que no puedo resolver. Tengo una clase que hace todo el trabajo de recuperación de mi base de datos. El error que tengo es la siguiente: Error de asignación deSin memoria al asignar cursores
android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=733 (# cursors opened by this proc=733)
la memoria se produce cuando hago esto:
mDatabaseInterface.getGraphForLevel(level);
Sé que es una fuga, ya que llamo este método cada 2,5 segundos o menos, y el 5 o 6 primeras llamadas pasan fácilmente. Ahora aquí están los métodos de mi clase DatabaseInterface:
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));
}
tengo una gran cantidad de métodos que se llaman entre sí, pero sé que no es un problema debido a la recursividad esta clase trabaja en otra aplicación. Mi pregunta principal es ¿por qué no cursor.close()
libera el cursor? Si hago algo como:
cursor = mDatabase.query(...);
cursor.moveToNext();
Node node = new Node(cursor.getInt());
cursor.close();
¿Se retiene el cursor en ese caso?
Gracias de antemano.
Solo para hacerte una idea, ¿qué tan grandes son las tablas para nodos y bordes? – Matthieu
Son muy pequeños por ahora, 20 filas y 10 columnas a lo sumo – chopchop