【发布时间】:2013-09-13 10:07:47
【问题描述】:
我有一个 GridView,其中每个项目都显示有关对象的信息。接下来,我有一个带有一些可运行任务的 IntentService。最后,还有一个从 BaseAdapter 扩展而来的自定义适配器,其中包含项目的 ArrayList。 IntentService 和 Gridview 之间的通信通过适配器中的 BroadcastReciver 进行,该适配器接收一个名为 Thumb 的特殊对象,该对象是一个 Parcelable 对象,作为 Intent 的额外出现。
到目前为止,一切都很典型。
现在,当一个任务在其可运行对象内的服务中启动时,我发送一个空的 Thumb(作为意图)。因此 GridView 向用户显示一个项目,该项目代表此时正在执行的任务,当任务完成时,该项目将使用新信息刷新。
这是我的问题:如何动态刷新 GridView 中对象的信息?
方法 1
我的第一个想法(我认为性能上最昂贵的)是:当 Intent 带有一个空的 Thumb 时,我会将其添加到 ArrayList 并通知适配器。然后当第二个意图带有“完整”拇指时,我将在 ArrayList 中搜索它并用另一个替换它。
- (+) 易于实施。
- (-) 性能不佳。我必须在 ArrayList 中搜索一个项目,检查它是否是同一个对象,然后替换它。
方法2
如果“Empty Thumb”和“Full Thumb”相同(因为在Task中只有一个正在更新的Thumb对象),引用(内存地址)必须相同。所以只需要第一次将空Thumb添加到GridView,然后当Full Thumb进入intent时,我会通知适配器刷新它(因为ArrayList已经有Thumb(参考))
- (+) 性能很好,因为我不需要对 ArrayList 进行操作
- (-) 不起作用。 (是的,一个很大的障碍)。所以我已经看到,如果我比较“Empty Thumb”和“Full Thumb”之间的引用(==)是不同的。我认为这是因为 Thumb 是一个 Parcelable 对象,它在不同线程中的可运行任务中执行,当在内部使用 BroadcastReciver 时,它会创建一个新对象或克隆 Thumb。所以对象不同。它是一种在线程之间传递对象的“可序列化”机制。
关于我应该如何关注这个问题的任何建议?
【问题讨论】:
-
我认为性能上最昂贵的 - 你实际测试过这个还是严格来说是一个意见(在这种情况下你应该测试它)?你的
Thumb类是否有一些东西可以用来从其他拇指对象中唯一地识别一个对象? -
我没有测试,因为第一种方法执行的操作更多(并且比第二种方法更昂贵[作为列表中的搜索])。我想生成一个像 UUID 或类似的 ID,但最后我不需要它。下来我解释一下我是怎么做到的。
标签: android android-intent android-service android-gridview