当适配器数据源在布局期间失效时会发生什么情况



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

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

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

这取决于您的后备数据的外观、您如何使其失效,以及您的 getView 是如何实现的。根据这些内容,您可能会得到一个表示旧数据、新数据或某些未定义状态的视图,这些状态可能会导致意外数据,甚至是 NullPointerException 或其他异常。

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

应始终从 UI 线程修改适配器的内容,以防止出现此问题。否则,您偶尔会得到ConcurrentModificationExceptionNullPointerExceptionIndexOutOfBoundsException

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

Google I/O 2010 - ListView 的世界

相关内容

最新更新