Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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?
Edit: Ich hab das so versucht:
Java:
Feld mFeld = new Feld();
mFeld.typ = 3;
feld.add(mFeld);
for (int i=0; i<feld.size(); i++) {
}
nur, wie lese ich dann diese Elemente wieder aus?
Edit: Ich hab es hinbekommen:
Java:
for (int i=0; i<feld.size(); i++) {
System.out.println(""+feld.get(i).typ);
}
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.
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 = new GameLoopThread(this);
surfaceHolder = getHolder();
surfaceHolder.addCallback(new SurfaceHolder.Callback() {
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
theGameLoopThread.setRunning(false);
while(retry){
try {
theGameLoopThread.join();
retry=false;
}catch(InterruptedException e){
}
}
}
public void surfaceCreated(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 state
if (c != null) {
holder.unlockCanvasAndPost(c);
}
}
}
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
}
});
Hier ist die GameLoopThread Klasse:
Java:
public class GameLoopThread extends Thread {
private GameView theView;
private boolean isRunning = false;
public GameLoopThread(GameView theView) {
this.theView = theView;
}
public void setRunning(boolean run) {
isRunning = run;
}
@Override
public void run() {
while (isRunning) {
Canvas theCanvas = null;
//startTime = System.currentTimeMillis();
try {
theCanvas = theView.getHolder().lockCanvas();
synchronized (theView.getHolder()) {
theView.onDraw(theCanvas);
}
} finally {
if (theCanvas != null) {
theView.getHolder().unlockCanvasAndPost(theCanvas);
}
}
}
}
}
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 = new ArrayList<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.