【发布时间】:2022-03-17 22:06:16
【问题描述】:
在我们公司,我们正在开发一款显示时间线的应用。我们愿意让用户(几乎)无限期地滚动它。
现在有两个事实需要考虑:
- 加载大光标可能会对性能产生不良影响(尤其适用于旧设备)
- 游标seem to have a size limit 1MB
在当前实现中,我们默认加载 40 个项目,然后当用户滚动超过某个阈值时,我们通过将限制增加到 40+20 个项目来重复查询,依此类推。
但是,这种方法似乎相当弱,因为它与前面所述的两个原则相冲突:查询最终会变得相当大,并且在某些时候游标可能会达到 1MB 的内存限制(我们加载了很多字符串)。
现在我们正在考虑利用MergeCursor 并像这样继续:
- 第一次加载包含 40 个项目的游标
- 当用户滚动超过某个级别时,我们会加载另一个包含接下来 40 个项目的游标,并在游标适配器中设置一个 MergeCursor,它将新游标连接到前一个游标。
- 继续使用此方法直到最多 X 步(取决于测试)以避免遇到一些 OOM 异常。最后,时间线光标将是 X 光标的串联。
您如何看待这种方法?任何弱点(除了开销,应该很小)?
如果您能指出/描述更好的解决方案吗?
提前致谢
【问题讨论】:
-
只是想知道:如果您将光标数据限制为仅显示所需的数据,是否仍然存在遇到所描述的可能问题的实际风险?我已经使用
CursorAdapter处理了数千个项目,但并没有真正注意到主要的性能影响(尽管快速滚动和部分索引变得更具挑战性)。然而,一个有趣的问题!我想任何保留有限数量“页面”的解决方案都可以解决这个问题。还有什么限制吗? IE。前面提到的快速滚动和/或部分索引? -
然后使用 AbstractWindowedCursor
-
感谢 cmets,我进行了更多调查,可能找到了解决我疑惑的方法。如果我错了,请告诉我。
标签: android android-listview android-cursor android-cursoradapter