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

Schreibe einen Kommentar