[英]App works fine, so can I ignore "CursorWindow: Window is full: requested allocation 12 bytes, free space 4 bytes, window size 2,097,152 bytes"?
我有一个 176,000 字的 SQLite 数据库和一个搜索它的应用程序(通过IntentService
)并且运行良好,永不崩溃。 即使返回了数千个“点击”,用户也可以快速无缝地滚动列表。 但是我经常--也许-总是收到标题中显示的 Logcat 警告消息。
我使用Cursor
访问数据库数据和ScrollView
内的TextView
,如下所示:
<ScrollView
...>
<TextView
android:id= "@+id/txaMatches"
android:scrollbars= "vertical"
.../>
</ScrollView>
代码:
// initialize, etc.
Cursor cursor = mdatabase.query(TABLE_NAME, mColumns, whereClause,
wildCardReplacements, null, null, WORD_COLUMN_NAME);
nRows = cursor.getCount();
while (n <= prefMaxMatches && i < nRows) {
cursor.moveToPosition(i);
// do stuff
}
但是这个警告让我想知道是否在代码中进行更改以摆脱它可能会提高响应能力。 某些搜索需要一段时间(即,不是立即输出,而是在合理的时间段内给出),这取决于输入的Pattern
(例如, *
必须搜索所有 176,000 个单词)。 任何人都可以接受它,但我们总是想要更快的速度。
我该怎么办? 只是忽略警告,因为它不会导致明显的不可接受的行为(例如,崩溃、执行缓慢)? 或者是什么?
编辑
Pztar 建议在查询中使用LIMIT 50
,但并不完全清楚如何这样做。 这是如何 - 将LIMIT 50
附加到“order by”列名称(对我来说,它是WORD_COLUMN_NAME
):
String __whereClause = "word like ?";
String[] __wildCardReplacements = {pattern};
cursor = mdatabase.query(TABLE_NAME, mColumns, __whereClause,
__wildCardReplacements, null, null,
WORD_COLUMN_NAME + " LIMIT 50");
-- 或者,正如 cricket_007 所建议的那样,--
使用具有另外一个参数的query
调用版本:
cursor = mdatabase.query(TABLE_NAME, mColumns, __whereClause,
__wildCardReplacements, null, null,
WORD_COLUMN_NAME, "50");
该应用程序可能会在您的特定设备或任何当前设备上正常运行,但您不能保证它会在旧设备上运行。 你绝对不应该忽视这一点。 您看到的警告是请求更多内存,在较弱的设备上,这可能会导致垃圾收集运行并随后在您的应用程序中导致意外结果。
根据您的帖子,查询可以没有模式,从而导致加载所有记录。 ListView
只能显示x
条记录(取决于设备高度) 假设这个数字是5
您在176k
列表的屏幕上一次只能看到5
条记录。 但是,您永远不会一次看到所有这些记录,那么为什么要一次加载它们呢? 我的建议是LIMIT
您的查询以及无休止的列表实现。
将您的查询更改为LIMIT 50
意味着您一次只能获得 50 条记录,然后将其添加到与无限列表配对的ListView
中。 现在,每次您的用户滚动并接近当前列表的末尾时,您都会运行查询以获取下一组 50 条记录并将其附加到您的列表中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.