Ich bin mit einem Map-Objekt in meiner Klasse, die ich mit Collections.synchronizedMap() für eine LinkedHashMap wie so synchronisiert habe:ConcurrentModificationException auch bei der Verwendung von Collections.sychronizedMap auf einem LinkedHashMap
private GameObjectManager(){
gameObjects = Collections.synchronizedMap(new LinkedHashMap<String, GameObject>());
}
Ich bin eine gleichzeitige Änderung Ausnahme in der dritten Zeile dieser Funktion bekommen:
public static void frameElapsed(float msElapsed){
if(!INSTANCE.gameObjects.isEmpty()){
synchronized(INSTANCE.gameObjects){
for(GameObject object : INSTANCE.gameObjects.values()){...}
}
}
}
Alle anderen Orte, an denen ich durch die Karte bin Iterieren, ich auf der Karte nach dem docs am synchronisieren.
Es gibt andere Funktionen in meiner Klasse, die diese Karte verwenden (die Synchronisierte!) Und sie put() und remove() Objekte, aber das sollte nicht wichtig sein. Was mache ich falsch? Bitte fragen Sie nach mehr Code, nicht sicher, was noch zu tun ist.
Oh, und die Log-Nachricht:
08-20 15:55:30.109: E/AndroidRuntime(14482): FATAL EXCEPTION: GLThread 1748
08-20 15:55:30.109: E/AndroidRuntime(14482): java.util.ConcurrentModificationException
08-20 15:55:30.109: E/AndroidRuntime(14482): at java.util.LinkedHashMap$LinkedHashIterator.nextEntry(LinkedHashMap.java:350)
08-20 15:55:30.109: E/AndroidRuntime(14482): at java.util.LinkedHashMap$ValueIterator.next(LinkedHashMap.java:374)
08-20 15:55:30.109: E/AndroidRuntime(14482): at package.GameObjectManager.frameElapsed(GameObjectManager.java:247)
08-20 15:55:30.109: E/AndroidRuntime(14482): at package.GamekitInterface.render(Native Method)
08-20 15:55:30.109: E/AndroidRuntime(14482): at package.GamekitInterface.renderFrame(GamekitInterface.java:332)
08-20 15:55:30.109: E/AndroidRuntime(14482): at com.qualcomm.QCARSamples.ImageTargets.GameEngineInterface.onDrawFrame(GameEngineInterface.java:107)
08-20 15:55:30.109: E/AndroidRuntime(14482): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1516)
08-20 15:55:30.109: E/AndroidRuntime(14482): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)
sollten Sie ** gameObjects ** verwenden, welche Funktionen verwenden, wenn Sie zweimal GameObjectManager() aufrufen; die ersten gameObjects und die zweiten gameObjects sind nicht das gleiche Objekt, so kann ConcurrentModificationException verursachen –
Ich verstehe nicht, was Sie sagten. Aber ich habe bemerkt, dass ich diesen Test nach der Synchronisierung machen sollte. Hast du das gesagt? – mpellegr