尝试关注有关列表的一般“dos and donts”,例如是 添加和删除200个项目列表中的30个项目然后清除 并重新填充?或者这方面的任何其他提示 - 我真的不能尝试 在我的手机上,快速为此: - )
有没有办法计算列表操作的内存开销/计算能力。背景如下:
我在页面上有一个列表视图,该页面有例如3个底部的标签(全部,搜索,最近)。现在,如果您单击选项卡,列表视图应显示适当的项目。
现在有两种不同的方法,一种是:
使用单个ListAdapter,相应地过滤项目 - 如果单击全部,只需将数据库中的所有项目放入其中 - 如果单击“最近”,则只需放置符合要求的项目
使用两个(三个)ListAdapters ,每个类别一个 - 如果单击全部,则将列表的适配器()设置为适当的一个 - 如果单击“最近”,请将“适配器”()设置为适当的
我们正在讨论200个项目的列表,这些项目是从数据库中创建的复杂对象。例如,搜索项目时,您输入标题的一部分,列表应仅显示相应的项目。这些项目不会被重新创建,我只会查询ID,并使用缓冲的项目(参见后面的数据结构)。
我还不确定的是“在哪里过滤”,我可以在数据库中进行选择(从标题LIKE abc中选择),然后是EITHER:
再次,澄清App数据的结构:
我希望你得到我的漂移,我想要感受“昂贵”的操作。也许,作为回答的最后动机,我会写一些案例,你可以就它们的成本给出一个意见:
感谢您提供反馈意见或任何有关不良做法的提示。特别可能的事件通过处理可见列表元素触发问题,而不是先“在后台”然后设置一个新的ListAdapter
答案 0 :(得分:2)
我看到你已经接受了答案,但我认为我不同意,因为ArrayList
必须复制所有元素,如果在中间是添加或删除的元素。
我知道您已经拥有HashSet
所有条目。
在这种情况下,我认为最有效的适配器是来自ArrayAdapter
的自定义ListAdapter
ArrayList mAllObjects
所有条目(对于“所有”选项卡)。ArrayList mRecentObject
个近期条目(针对“最近”标签)ArrayList mMatchObject
个匹配条目(对于“搜索”标签)mRecentObject
列表(如果它不存在则创建它)mMatchObject
列表并添加匹配元素。这里没有优化。 ArrayList上的delete()
方法是O(n)。答案 1 :(得分:1)
我不确定我是否理解你要对整个列表做什么,但对于filtering
,你应该在数据库端(在你提到的select语句中)这样做...特别是因为这个应用程序是针对移动设备的(在顶部给出评论)并且您希望将密集型操作卸载到服务器端而不是将它们留在移动设备上。
答案 2 :(得分:1)
在黑暗中轻微刺伤。从(相当粗略的)"Designing for Performance" document,似乎对象创建,特别是短期对象,具有非常高的成本。我将此解释为来自两个地方:1)对象创建开销(特别是对于复杂对象),以及2)当这些超出范围或被明确销毁时调用GC。
因此,作为一个起点,我认为你想要在数据库中完成工作,并将增量推送到视图。因此,根据您的原始问题,请执行:
我想你可以为此编写一个综合基准,以了解速度的差异。但是,在我自己的代码中,我尝试尽可能地避免使用性能文档所建议的短期对象。 GC的影响是重量级的,因为它经常会扰乱UI线程并使其在工作中打嗝。