java - 应用程序运行良好,那么我可以忽略 "CursorWindow: Window is full: requested allocation 12 bytes, free space 4 bytes, window size 2,097,152 bytes"吗?

标签 java android sqlite

我有一个 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 个单词)。任何人都可以接受它,但我们总是想要更快的速度。

我该怎么办?只是忽略警告,因为它不会导致明显的 Not Acceptable 操作(例如,崩溃、执行缓慢)?或者什么?

编辑

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你只会看到5在屏幕上一次记录 176k .但是,您永远不会一次看到所有这些记录,那么为什么要一次加载它们呢?我的建议是LIMIT您的查询加上 endless list implementation.

将查询更改为 LIMIT 50这意味着您一次只能获得 50 条记录,然后将其添加到您的 ListView搭配无尽的 list 。现在,每次您的用户滚动并接近当前列表的末尾时,您都会运行查询以获取下一组 50 条记录并将其附加到您的列表中。

关于java - 应用程序运行良好,那么我可以忽略 "CursorWindow: Window is full: requested allocation 12 bytes, free space 4 bytes, window size 2,097,152 bytes"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37034570/

相关文章:

java - 将 `List<Map<String, Object>> row` 的 null 转换为空字符串

java - wget 文件下载 ftp waitfor() 挂起

Java HttpURLConnection 使用 SOCKS 代理而不是 HTTP

java - android中的路径交叉点

android - 如何实现GeckoView?

python - 匹配键并插入到新列中

android - 当不存在数据库或表时,是否可以在 Android 中模拟 sqlite3 Cursor?

java - JTabbedPane 和 JInternalFrame 哪个更好用?

java - 以编程方式更改图层列表资源内形状的填充值

sqlite - 当值来自多个表时,如何在SQLite中使用WHERE BETWEEN子句?