Array abarbeiten und bei Fehler zurück ins Array legen

Fohnbit

Top Contributor
Hallo,

ich sammle Daten und lege diese in ein ArrayList:
private ArrayList<ChannelValue> channelValueList = new ArrayList<ChannelValue>();

Ein Timer soll dann die ArrayList ins Internet übertragen.

Hierzu lege ich die lokale ArrayList in ein Upload ArrayList:
private ArrayList<ArrayList<ChannelValue>> uploadChannelValueList = new ArrayList<ArrayList<ChannelValue>>();

Mein Code:
Java:
    public void onSenden() {
        if (uploadChannelValueList.isEmpty()) {
            return;
        }
        uploadChannelValueList.add(channelValueList);
        for (Iterator<ArrayList<ChannelValue>> iterator = this.uploadChannelValueList
                .iterator(); iterator.hasNext();) {

            ArrayList<ChannelValue> value = iterator.next();
            Runnable r = new SendHTTP(value, getPropertyUrl(),
                    getPropertyNodeid(), getPropertyApikey(), this);

            new Thread(r).start();
            iterator.remove();
        }
        channelValueList.clear();
        updateOutputBuffer(channelValueList.size());
        updateOutputUploadbuffer(uploadChannelValueList.size());
    }

Bei einem Fehlerhaften Upload:
Java:
    public void HttpAnswerFired(ArrayList<ChannelValue> channelValue) {
        System.out.println("Not uploaded: " + channelValue.toString());
        uploadChannelValueList.add(channelValue);
        updateOutputUploadbuffer(uploadChannelValueList.size());
    }

Nun scheint es so, als würde "iterator.remove();" kein Element aus dem ArrayList löschen.

Ich vermute ich verwechsle einen Zeiger mit einem neuem Objekt?

uploadChannelValueList.add(channelValueList);
Wird hier die ArrayList in das neue ArrayList kopiert oder nur ein Pointer erstellt?
 
Java arbeitet nur mit "CallByValue" sprich es wird der Wert der Referenz übergeben und dieser Wert zeigt auf das Objekt.

Nun scheint es so, als würde "iterator.remove();" kein Element aus dem ArrayList löschen.
Wie kommst du zu deiner Vermutung? Welches Verhalten veranlasst dich dazu?
Einfach Überprüfung ob es richtig funktioniert: Lass dir doch einfach mal die Listengröße vor und nach der Schleife ausgeben, du wirst sehen das "remove()" ohne Probleme funktioniert.



Irgendwie glaube ich hast du dich mit deinen Listen etwas vertan (kann mich aber auch irren):
Java:
channelValueList.clear();
updateOutputBuffer(channelValueList.size());
Welchen Sinn sollen diese beiden Zeilen haben? Zuerst leerst du die Liste, danach verwendest du die größe als Parameter. Die Größe hier wird immer 0 sein.

Java:
uploadChannelValueList.add(channelValueList);
for (Iterator<ArrayList<ChannelValue>> iterator = this.uploadChannelValueList.iterator(); iterator.hasNext();) {
   ArrayList<ChannelValue> value = iterator.next();
   ......
   iterator.remove();
}
.....
updateOutputUploadbuffer(uploadChannelValueList.size());
Auch diese Logik finde ich komisch. Sofern deine upload Liste leer ist sendest du nichts ok.
Sollte etwas vorhanden sein, fügst du eine weitere Liste hinzu und iterierst über die uploadListe.
Jeder Eintrag aus der upload-Liste wird entfernt und am Ende der Methode willst du wieder auf die Größe der upload-Liste zugreifen -> die wird immer 0 sein an dieser Stelle.
 

Zurück
Oben