繁体   English   中英

应用程序工作正常,所以我可以忽略“CursorWindow:窗口已满:请求分配 12 字节,可用空间 4 字节,窗口大小 2,097,152 字节”?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM