Ich konnte es noch nicht ausprobieren, da ich nicht weiss, wie ich ein Element mit meine Eigenschaften hinzufügen kann, diese sich im Feld Klasse befinden mit ArrayList.
Wie kann ich mit ArrayList ein Element hinzufügen, mit meine Eigenschaften, diese sich in der Klasse Feld befinden?
Vielen Dank, ist natürlich bequemer und funktioniert auch.
Nur wenn ich ein Element entfernen möchte, dann erhalte ich eine fehlermeldung:
Java:
12-1107:33:53.098:E/AndroidRuntime(1183): java.util.ConcurrentModificationException12-1107:33:53.098:E/AndroidRuntime(1183): at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible.
For example, it is not generally permissible for one thread to modify a Collection while another thread is iterating over it.
Ich geh mal davon aus, dass Du hier ein Spiel programmieren willst und dass Du daher (unbewusst) Threads benutzt. Also liegt es nahe, dass der Fehler wegen der Benutzung der Threads geworfen wird, wie schon die API verlauten lässt.
Hallo nochmal,
ich erhalte ab und zu trotzdem diese fehlermeldung:
Java:
12-1314:59:45.282:E/AndroidRuntime(29917): at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
Dieser fehler zeigt mir an dieser stelle an:
Java:
for(Iterator<SpielfeldData> it = spielfeldData.iterator(); it.hasNext();){SpielfeldData sData = it.next();..............}
Kann es Vielleicht daran liegen, dass ich im Quellcode etwas weiter unten, bestimmte Elemente entferne?
Java:
int id = spielfeldData.get(spielfeldData.size()-1).id;for(Iterator<SpielfeldData> it = spielfeldData.iterator(); it.hasNext();){SpielfeldData sData = it.next();if(sData.id == id){
it.remove();}}
Java macht mir nur Probleme, wenn es um Array geht, das kenne ich bei anderen Programmiersprachen garnicht.
Im Spiel benutze ich eine GameLoopThread und diese Starte ich mit:
Java:
theGameLoopThread =newGameLoopThread(this);
surfaceHolder =getHolder();
surfaceHolder.addCallback(newSurfaceHolder.Callback(){publicvoidsurfaceDestroyed(SurfaceHolder holder){boolean retry =true;
theGameLoopThread.setRunning(false);while(retry){try{
theGameLoopThread.join();
retry=false;}catch(InterruptedException e){}}}publicvoidsurfaceCreated(SurfaceHolder holder){
theGameLoopThread.setRunning(true);
theGameLoopThread.start();Canvas c =null;try{
c = holder.lockCanvas(null);synchronized(holder){onDraw(c);}}finally{// do this in a finally so that if an exception is thrown// during the above, we don't leave the Surface in an// inconsistent stateif(c !=null){
holder.unlockCanvasAndPost(c);}}}publicvoidsurfaceChanged(SurfaceHolder holder,int format,int width,int height){}});
Kann es Vielleicht auch am GameLoopThread liegen?
Wenn ja, gibt es Vielleicht eine bessere Methode, den Canvas immer wieder neu zu zeichnen und onDraw aufzurufen?
Hi,
Die Exception sagt aus, dass du während dem iterieren der ArrayList versucht hast, ein Element zu entfernen.
Du kannst es so machen, dass du eine neue ArrayList erstellst und dann alle gewünschten Elemente in dieser List hinzufügst. Dann wird am Schluss noch die Referenz geändert.
Java:
ArrayList<SpielfeldData> temp =newArrayList<SpielfeldData>();int id = spielfeldData.get(spielfeldData.size()-1).id;for(SpielfeldData sData : spielfeldData){if(sData.id != id){
temp.add(sData );// so werden alle Elemente deren id != id ist, hinzugefügt.}}
spielfeldData = temp;// Am Schluss wird die Referenz von temp an spielfeldData zuweisen.// Nun hast du eine List, in derdas Element mit id entfernt wurde.