gpt4 book ai didi

android - 分配游标时内存不足

转载 作者:IT王子 更新时间:2023-10-28 23:30:16 25 4
gpt4 key购买 nike

我有一个无法解决的内存问题。我有一个类可以完成我所有的数据库检索工作。我遇到的错误如下:

android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=733 (# cursors opened by this proc=733)

执行此操作时出现内存分配错误:

mDatabaseInterface.getGraphForLevel(level);

我知道这是一个泄漏,因为我大约每 2.5 秒调用一次此方法,并且第 5 或 6 次调用很容易通过。现在这里是我的 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));
}

我有很多相互调用的方法,但我知道这不是递归问题,因为这个类在另一个应用程序中工作。我的主要问题是为什么不 cursor.close() 释放光标?如果我这样做:

cursor = mDatabase.query(...);
cursor.moveToNext();
Node node = new Node(cursor.getInt());
cursor.close();

这种情况下光标是否保留?

提前致谢。

最佳答案

cursor.close() 的调用应该在 finally block 中,以防在迭代时引发异常。

Cursor cursor = mDatabase.query("nodes", null, 
"level = " + wrapSql(String.valueOf(level.getId())), null, null, null, null);
try {
while (cursor.moveToNext()) {
l.add(parseNodeFromCursor(cursor));
}
} finally {
cursor.close();
}

关于android - 分配游标时内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12577400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com