0

假设我有一个与共享数据集接口的适配器。在复合视图(即listView)的布局期间,调用getView 并访问适配器。后续元素调用 GetView。适配器提供对共享数据集中元素的直接锁定引用。

现在数据集可能会从适配器下方更改。在这种情况下,适配器将在数据集更改时失效。但是,当 UI 处于绘制或布局阶段时,数据可能会失效。

我的问题是,如果另一个线程在视图迭代其子项时使数据集无效(正在调用 getView,并且正在访问适配器),会发生什么?

4

2 回答 2

0

您应该始终从 UI 线程修改适配器的内容,以防止出现此问题。否则你偶尔会得到一个ConcurrentModificationException,NullPointerException或一个IndexOutOfBoundsException.

如果您还没有机会观看,我强烈推荐 I/O 2010 上关于 ListViews 的讨论,其中有大量关于它们如何工作以及如何优化它们的好信息。

Google I/O 2010 - ListView 的世界

于 2013-09-10T21:47:34.533 回答
0

这取决于您的支持数据是什么样的,您如何使其无效,以及您的 getView 是如何实现的。根据这些情况,您可能会得到一个表示旧数据、新数据或某些未定义状态的视图,这些状态可能会导致意外数据甚至 NullPointerException 或其他异常。

如果您在问题中提供有关数据类型和适配器的更多详细信息,则可以提供更详细的答案。您的适配器的源代码,特别是您的 getView 方法也将允许更具体的答案。

于 2013-09-10T21:14:52.253 回答