>假设我有一个与共享数据集接口的适配器。在复合视图(即列表视图)的布局期间,将调用 getView 并访问适配器。后续元素调用 GetView。适配器提供对共享数据集中元素的直接锁定引用。
现在,数据集可能会从适配器下方更改。在这种情况下,当数据集更改时,适配器将失效。但是,当 UI 处于绘制或布局阶段时,数据可能会失效。
我的问题是,如果另一个线程在视图遍历其子级时使数据集无效(正在调用 getView,并且正在访问适配器)会发生什么?
这取决于您的后备数据的外观、您如何使其失效,以及您的 getView 是如何实现的。根据这些内容,您可能会得到一个表示旧数据、新数据或某些未定义状态的视图,这些状态可能会导致意外数据,甚至是 NullPointerException 或其他异常。
如果您在有关数据类型和适配器的问题中提供了更多详细信息,则可以提供更详细的答案。适配器的源代码,特别是 getView 方法,也将允许更具体的答案。
应始终从 UI 线程修改适配器的内容,以防止出现此问题。否则,您偶尔会得到ConcurrentModificationException
,NullPointerException
或IndexOutOfBoundsException
。
我强烈推荐 I/O 2010 关于 ListViews 的讨论,如果你还没有机会观看它,里面有大量关于它们如何工作以及如何优化它们的好信息。
Google I/O 2010 - ListView 的世界