多个ListAdapter或单个,使用过滤(Android性能)

时间:2011-12-04 20:44:31

标签: android performance android-listview

  

尝试关注有关列表的一般“dos and donts”,例如是   添加和删​​除200个项目列表中的30个项目然后清除   并重新填充?或者这方面的任何其他提示 - 我真的不能尝试   在我的手机上,快速为此: - )

有没有办法计算列表操作的内存开销/计算能力。背景如下:

我在页面上有一个列表视图,该页面有例如3个底部的标签(全部,搜索,最近)。现在,如果您单击选项卡,列表视图应显示适当的项目。

现在有两种不同的方法,一种是:

使用单个ListAdapter,相应地过滤项目 - 如果单击全部,只需将数据库中的所有项目放入其中 - 如果单击“最近”,则只需放置符合要求的项目

使用两个(三个)ListAdapters ,每个类别一个 - 如果单击全部,则将列表的适配器()设置为适当的一个 - 如果单击“最近”,请将“适配器”()设置为适当的

我们正在讨论200个项目的列表,这些项目是从数据库中创建的复杂对象。例如,搜索项目时,您输入标题的一部分,列表应仅显示相应的项目。这些项目不会被重新创建,我只会查询ID,并使用缓冲的项目(参见后面的数据结构)。

我还不确定的是“在哪里过滤”,我可以在数据库中进行选择(从标题LIKE abc中选择),然后是EITHER:

  • 从列表中删除不匹配的项目,添加所有匹配的(但不包括在内)项目
  • 清除整个列表,添加所有匹配的项目

再次,澄清App数据的结构:

  • 数据库包含原始简单条目(ID +标题+ ...)
  • HashSet 包含复杂条目,从DB创建一次, readonly +始终所有条目
  • ArrayList 列表视图中显示的当前条目

我希望你得到我的漂移,我想要感受“昂贵”的操作。也许,作为回答的最后动机,我会写一些案例,你可以就它们的成本给出一个意见:

  1. 使用“标题LIKE”从DB中选择N个项目(仅限ID)
  2. 使用“title.contains()”迭代200个项目的列表并仅使用匹配
  3. 通过列表视图从arlahylist中删除100个项目
  4. 从未显示的arraylist中删除100个项目,然后连接并显示
  5. 感谢您提供反馈意见或任何有关不良做法的提示。特别可能的事件通过处理可见列表元素触发问题,而不是先“在后台”然后设置一个新的ListAdapter

3 个答案:

答案 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线程并使其在工作中打嗝。