当填充ListView/RecyclerView项时,查询数据库的最佳实践

3
我有一个ListView/RecyclerView。现在,我想为每个项目添加更多信息,并且可以根据项目值在数据库中找到该信息。你们是如何实现的?
最佳实践是应该在后台线程中查询数据库吗?如果用户快速滚动,我应该取消查询吗?

通常情况下,对于小到中等大小的数据集合,您会在首次填充 ListView 之前加载所有数据。 - CommonsWare
1个回答

2
据我所知,不存在“最佳实践”,但以下是您的选择的简短摘要:
在用户滚动时在UI线程上查询
通常情况下,在UI线程执行查询是非常不好的做法。在ListView中这样做更是罪恶。
尽管如此,仍有ORM库在UI线程上执行嵌套对象的惰性加载(例如GreenDAO)。人们在具有ListViews的应用程序中使用这些库,并且对于其中的一些应用程序,它甚至运行得很好。
我强烈反对这种方法。
提前查询所有项目
如@CommonsWare所提到的,对于小到中等的集合,您可以在后台线程上将整个数据集加载到内存中,然后将其绑定到ListView。在加载数据时,您需要显示某种进度指示。
“小”和“中”定义非常模糊,但我认为如果您确信数据集不会大于几MB,则此方法可以很好地工作。
该方法的缺点是用户需要等待整个数据集被加载并绑定到ListView。这可能需要一段时间,具体取决于数据集的大小和数据库方案的复杂性。
最初查询一定数量的项目,然后随着用户滚动执行其他查询
这是所有方案中最复杂的方案,但在某些情况下(例如“无限列表”)是不可避免的。
该想法是将一些预定义数量的项目放入ListView中,然后跟踪用户的交互以提供其他项目。
例如,您可以最初获取100个项目,然后在用户滚动到列表底部时获取另外100个项目。
这种方案的优化是在用户到达列表末尾之前(假设他浏览了50个项目)获取其他项目。这样可以创建真正的“无限列表”行为。
请注意,如果您的集合非常大,则不仅需要添加新项目,而且还需要删除“先前”项目,以避免内存不足崩溃。
查询已显示项目的其他信息
有时,您希望在显示项目后执行某些其他查询。
在这种情况下,只需在后台执行查询并将数据绑定到该项目即可。
这项任务的一个警告是,如果视图被回收(默认情况下在RecyclerView中),则当后台获取完成时,目标视图可能会显示完全不同的项目。将返回的数据绑定到此视图将是错误的。
处理此问题的一种方法是取消获取。但是,在实践中,这很麻烦且容易出错。
更简单的方法是在启动查询时设置transientState标志,并在完成查询时清除它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接