假设我有一个与共享数据集接口的适配器。在复合视图(即listView)的布局期间,将调用getView并访问适配器。后续元素将调用GetView。适配器提供对共享数据集中元素的直接锁定引用。
现在,数据集可以从适配器下面更改。在此场景中,当数据集发生更改时,适配器将失效。但是,当UI处于绘图或布局阶段时,数据可能会失效。
我的问题是,当视图遍历它的子级(调用getView,访问适配器)时,如果另一个线程使dataset无效,会发生什么?
发布于 2013-09-11 05:14:52
这取决于你的备份数据是什么样子,你是如何使它失效的,以及你的getView是如何实现的。根据这些情况,您可能会得到一个表示旧数据、新数据或某些未定义状态的视图,这些状态可能会导致意外数据,甚至是NullPointerException或其他异常。
如果您在问题中提供有关数据类型和适配器的更多详细信息,则可以提供更详细的答案。您的适配器的源代码,特别是您的getView方法,也可以提供更具体的答案。
发布于 2013-09-11 05:47:35
您应该始终从UI线程修改适配器的内容,以防止由此产生的问题。否则,你偶尔会得到一个ConcurrentModificationException、NullPointerException或IndexOutOfBoundsException。
如果你还没有看过I/O2010关于ListViews的演讲,我强烈推荐,里面有大量关于它们如何工作以及如何优化它们的好信息。
https://stackoverflow.com/questions/18728522
复制相似问题