- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 Android 应用程序时遇到问题。
我有一个线程不断迭代列表或形状,更新它们的位置,有时还会从列表中删除一个项目。在线程的 while 循环结束时,它调用 postInvalidate() 以提示重新绘制。
这是对 ArrayList 进行修改的代码。
Iterator<Shape> iterator = this.myList.iterator();
while (iterator.hasNext()) {
Shape nextShape = iterator.next();
nextShape.move();
if(condition) {
iterator.remove()
}
}
onDraw 方法使用 for each 循环来绘制每个项目。尽管只通过迭代器修改列表,但我在 onDraw 方法中得到并发修改。我试过 CopyOnWriteArrayList 和 Collections.synchronized,结果相同。
如有任何帮助,我们将不胜感激。
最佳答案
有几种方法可以解决这个问题。一种是在线程和 onDraw 中使用同步块(synchronized block),但这会阻止第二个线程与 UI 线程同时运行。
我认为最好的方法是使用两个集合。你的代码应该是这样的
onDraw(){
synchronized(myList){
//Do your draw code. Get the iterator inside this block
}
}
threadFunction(){
List threadList;
while(1){
//Update threadList, which holds all the objects
synchronized(myList){
myList = threadList.copy(); //Do a deep copy, don't just copy over the reference
}
postInvalidate();
}
}
这将使您的绘制函数对迭代结束时制作的列表副本进行操作。如果您正在处理深拷贝,您将不会遇到任何同步问题,因为线程不会更改相同的列表。同步块(synchronized block)将阻止线程在绘制期间覆盖绘制函数的副本。唯一剩下的问题是线程中列表的覆盖将挂起,直到绘制完成,但由于更新频率比屏幕上无论如何都不会显示,我猜这是可以接受的。
关于Android ConcurrentModification onDraw(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13391077/
我试图通过点及其距离的排列来了解某些事物的可能性(不要告诉我没有,这是我失败的项目)。 for (Point p1 : results) { remove.clear(); for (
我在使用 Android 应用程序时遇到问题。 我有一个线程不断迭代列表或形状,更新它们的位置,有时还会从列表中删除一个项目。在线程的 while 循环结束时,它调用 postInvalidate()
考虑玩家类...当玩家加入游戏(创建对象)时,它会检查是否已加入同名玩家... public class Player { private static List players = new
我写了这个小程序来对数组进行排序。据我了解,它应该打印 0,1,2。 但是,当我运行这个程序时,我得到了 ConcurrentModificationException public clas
我们有多个线程尝试从 EHCache 获取数据,这有时会导致并发修改异常。我尝试使用 Retryable 来解决这个问题,但它似乎没有做任何事情。有什么建议吗? @Override @Retryabl
我知道对此有很多问题,但在我的例子中,我将它放在一个同步块(synchronized block)中,我确信没有人会更改我的数组列表。但是如果我使用 for-每个循环.. 为什么? 这是我的代码 fr
枚举是故障安全的。故障安全迭代器将用于原始集合的克隆。那为什么它会抛出 concurrentModificationException?请澄清。 请找到我的代码: public static void
当我添加最后 7 个项目位置时,我遇到了问题,其他 6 个项目在 hasEnded 时可以完美地自动删除。我无法添加第 7 个项目,当我获得其他项目(例如 1-6)并添加第 7 个项目时,我的应用程序
我有一个 hashmap 同时用于多个线程。为了使其线程安全,我将其放入同步块(synchronized block)中: private final Map mapConnections = new
在我的应用程序中,我使用了一个 Map 来存储 POJO 对象。根据要求,我需要遍历 Map 的 keySet 并删除不需要任何修改的对象。 考虑下面的代码: public void remove(
我有以下代码块,我想使用它来将值存储在 JSONObject 中,以便迭代它并在前端呈现它。 JSONObject dlCovs = jsonObject.getJSONObject(
我在操作 HashMap 时遇到了 ConcurrentModificationException。代码如下: Iterator iterator =cacheMap.keySet().ite
我对 Java 应用程序中刚刚遇到的一个问题感到非常困惑。 当我尝试运行下面给出的代码时,Java 在“if ( this.vertexStore.get ( v ).addAll ( output
我是一名优秀的程序员,十分优秀!