2013-11-20 60 views
20

我创建了一个由查询返回的数据填充的ListView。
它的工作原理,但在logcat中我已经得到了消息:光标窗口:窗口已满

Cursor Window: Window is full: requested allocation 444 bytes, free space 363 bytes, window size 2097152 bytes 

,它采用了几分钟后,装载/可视化的ListView。

我的查询返回大约3700行String/Int/Double,其中每行都有30列;没有图像或特定数据类型

这条消息究竟意味着什么,我该如何避免它?
您可以通过更改此光标窗口来提高性能吗?

+2

请参阅此:http://stackoverflow.com/questions/11863024/android-cursor-window-is-full –

+0

谢谢,但我已经看到了这个问题,我不能使用SD卡 – Tirrel

+0

任何更新这个?在某些情况下,我在字符串列表中遇到了同样的问题。 –

回答

14

根据我的经验,这意味着查询结果对于光标的窗口来说太大,并且它会请求更多的内存。大多数情况下,这个请求都很有用,但是在低端设备上它可能会引发异常。

我不知道有问题的应用程序的细节,但你提到一个ListView。 ListView不能一次显示3700行,并且endless list可以帮助按需加载数据

我的建议是将查询分解为多个查询,以返回较小的结果并在运行下一个查询之前关闭它们。每个连续的查询合并结果后。

+0

一个ListView可以显示一个超过10 000行的游标(基于我自己的经验)。这个问题无疑是关于记忆,而不是行数。 – matreshkin

+0

@matreshkin同意,这是一个ListView的整个点:根据屏幕上可见的内容来延迟加载和渲染行。 –

+1

顺便说一句,现在我看到@Delblanco写道“一个ListView不能显示3700行AT ONCE”。听起来令人困惑,但实际上3700视图附属于窗口似乎是非同寻常的情况:) – matreshkin

1

我也有这个问题。在我的情况下,我在数据库中保存了一张2.2 MB的图像。当加载使用Cursor.getBlob()数据库中的数据我会在日志中看到这样一条消息:

CursorWindow: Window is full: requested allocation 2202504 bytes, free space 2076560 bytes, window size 2097152 bytes 

,如果我尝试检索连续行的任何数据(字符串,数字等),我会得到这个消息后,它返回为null没有任何错误。 解决方案是删除2.2 MB的blob。我不知道是否可以在Android中从数据库加载更大的Blob。