AsyncTask, EndAllActiveAnimators - ich kriegs nicht hin :-(

  • Antworten:24
  • Bentwortet
Gerd-Ulrich M.
  • Forum-Beiträge: 770

08.08.2016, 21:00:45 via Website

Hallo,
nach längerer Zeit (einem geradezu "erzwungenen" Update auf Windows10 sowie der Aktualisierung auf Android Studio 2.1.2) kann ich endlich an meiner Heizungssteuerung weitermachen.
Aus irgendeinem Grund komme ich aber immer noch nicht weiter :'(

Jetzt hab ich mal (ich weiß, es ist "unfein" und "not-Java-like") alle nötigen Klassen entweder aufgelöst oder in die Hauptklasse integriert.
Das angehängte Bild zeigt, wo ich nicht weiterkomme....die Routine decodeCubeMessage(CubeSocketStream); wird noch ausgeführt (sieht man auch an den Log-Meldungen), aber dann ist Schluss :(

image

Nachdem das das letzte Mal relativ gut funktioniert hat, hab ich das Projekt nochmal bei Dropbox (CubeControl6.zip abgelegt (die alte Version ist natürlich gelöscht) - ich hoffe, wieder mal, dass die Admins Verständnis dafür haben.
Vielleicht kann ja nochmal jemand mich auf den richtigen Weg "stupsen"?

Danke und Gruss
G.-U.M.

N'y pas n'y
tu car tu
mal tu mal

Antworten
swa00
  • Forum-Beiträge: 3.704

08.08.2016, 21:32:54 via Website

Moin Gerd,

das Bild kann ich nicht für die Erkenntlichkeit zoomen, könntest du bitte mal die Meldung hier reinstellen ??
(Log)

— geändert am 08.08.2016, 21:33:40

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

08.08.2016, 22:31:14 via Website

Die Meldung die du eigekreist hast, ist kein Error.
Es ist ledigleich der Hinweis, dass der System OpenGl renderer gerade die Animationen o.ä. beendet hat. Mit deinem AsyncTask hat das erstmal nichts zutun. Solche Systemmeldungen würde ich beim Debugen vorerst ignorieren und eher Prüfen ob man nicht selber fehler gemacht hat, anstatt diese im System zu suchen.
Hast du den Code mal komplett durchdebuggt?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gerd-Ulrich M.
  • Forum-Beiträge: 770

09.08.2016, 06:56:21 via Website

Hallo,
das Problem beim Debuggen ist, das ich genau bis an diese Stelle (Routine decodeCubeMessagekomme und danach nicht mehr weiter. Der Debugger springt nicht mehr weiter sondern die App läuft ohne Debugger. Ich weiß nicht wie ich den Debugger zwingen kann weiter zu laufen.... Dann könnte ich der Vermutung nach gehen dass der nächste Aufruf "toter Code" ist der kein Ergebnis liefert. Aber dazu müsste ich das kontrollieren können.
Ich hatte schon versucht, den Inhalt von getCubeRaeume(hab jetzt den Sourcecode nicht greifbar) in decodeCubeMessage zu integrieren aber da werden diese Zeilen auch vom Debugger ignoriert.
So langsam weiß ich nicht mehr was ich noch probieren soll.
Gruss
G.-U.M.

N'y pas n'y
tu car tu
mal tu mal

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

09.08.2016, 07:18:35 via App

Liegt evntl daran dass das ganze Async ist. Benutzt du in der Decode Methode wenigstens Log.d o.ä. damit du irgendwas siehst?

— geändert am 09.08.2016, 07:19:19

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gerd-Ulrich M.
  • Forum-Beiträge: 770

09.08.2016, 09:02:00 via Website

In decodeCubeMessage ist alles sinnvolle mit Log-Ausgaben versehen. Daher weiß ich, dass diese Routine noch komplett durchlaufen wird.

Ich habe inzwischen irgendwo gefunden, dass jemand eine solche Fehlermeldung (allerdings mit anderer Adresse) mit Hilfe einer kurzen Verzögerung nach dem AsyncTask beheben konnte.
Aber das würde ja eigentlich den Zweck des AsyncTask umgehen?! :?

Könnte das trotzdem eine Möglichkeit sein? Ich probiers heute abend mal aus und erstatte Bericht.

Trotzdem schon mal vielen Dank für's Mitdenken.
Gruss
G.-U.M.

N'y pas n'y
tu car tu
mal tu mal

Antworten
Gerd-Ulrich M.
  • Forum-Beiträge: 770

09.08.2016, 09:08:34 via Website

Hallo,

Log kann ich erst heute abend reinstellen, aber die Meldung selbst lautet (zumindest soweit es der Screenshot hergibt):

08-08 19:50:33.349 17163-17191/com.gumproductions.gu_meyer.cubecontrol.app D/OpenGLRenderer: endAllActiveAnimators on 0x9e022700 (ListPopUpWindowDropDownListView)

Leider hat eine Google-Suche hiernach keine Ergebnisse gebracht (vlt. hab ich auch nur die falschen Suchbegriffe verwendet).

Gruss
G.-U.M.

N'y pas n'y
tu car tu
mal tu mal

Antworten
Gerd-Ulrich M.
  • Forum-Beiträge: 770

09.08.2016, 21:35:41 via Website

So,
erstmal die vollständige Log-Zeile:
08-09 21:24:33.160 30008-30075/com.gumproductions.gu_meyer.cubecontrol.app D/OpenGLRenderer: endAllActiveAnimators on 0x9df89700 (ListPopupWindow$DropDownListView) with handle 0x9df47bb0

Aber: Der Tipp von @Pascal P. war gut - bei genauerer Analyse der Routine decodeCubeMessage habe ich herausgefunden, dass sich der Task wohl immer noch in der While-Schleife befindet.
Zum besseren Verständnis hier diese Routine:

 public void decodeCubeMessage(InputStream CubeRawDataStream) {
        InputStreamReader isr = new InputStreamReader(CubeRawDataStream);
        BufferedReader br = new BufferedReader(isr);

        Log.d("ccn", "decodeCubeMessage");

        try {
            String MessageZeile = "";
            while ((MessageZeile = br.readLine()) != null) {
                if (!MessageZeile.equals("")) {
                    char msgtyp = MessageZeile.charAt(0);
                    switch (msgtyp) {
                        case 'H': {
                            Log.d("ccn", "Message H");
                            String CubeMessage = MessageZeile.substring(3, MessageZeile.length());
                            List<String> msgstrl = new ArrayList<String>(Arrays.asList(CubeMessage.split(",")));
                            // Die Stringliste enthält zeilenweise die einzelnen Einträge
                            cDevice4 AktDevice = new cDevice4();  // ein einzelnes "Device" 
                            AktDevice.setDeviceTypeSelector(0);     // es ist bekannt, dass es um den Cube geht
                            AktDevice.setCubeCubeSerialNumber(msgstrl.get(0));
                            AktDevice.setCubeCubeRFAddress(msgstrl.get(1));
                            // Jetzt das Device in die Liste eintragen
                            CubeNetz.add(AktDevice);
                        }
                        case 'C': {
                            break;
                        }
                        case 'L': {
                            break;
                        }
                        case 'M': {
                            Log.d("ccn", "Message M");
                            // diese Message kommt mehrfach vor
                            String CubeMessage = MessageZeile.substring(3, MessageZeile.length());
                            List<String> msgstrl = new ArrayList<String>(Arrays.asList(CubeMessage.split(",")));
                            int MessageIndex = parseInt(msgstrl.get(0));
                            int MessageCount = parseInt(msgstrl.get(1));
                            String DataString = msgstrl.get(2);
                            // Decodierung von Base64 nach String
                            byte[] DecodedBytes = Base64.decode(DataString, Base64.NO_WRAP);
                            DecodedBytes = copyOfRange(DecodedBytes, 2, DecodedBytes.length);
                            Log.d("ccn", "Anfang Zerlegung Message in Räume");
                            int CubeMMsg_RoomCount = DecodedBytes[0];  // ist nur ein Zeichen lang
                            DecodedBytes = copyOfRange(DecodedBytes, 1, DecodedBytes.length);
                            for (int RaumIndex = 0; RaumIndex < CubeMMsg_RoomCount; RaumIndex++) {
                                cDevice4 AktDevice = new cDevice4();
                                AktDevice.setDeviceTypeSelector(1);     // 1 = Raum
                                AktDevice.setRaumID(DecodedBytes[0]);
                                DecodedBytes = copyOfRange(DecodedBytes, 1, DecodedBytes.length);
                                int LaengeRaumName = DecodedBytes[0];
                                AktDevice.setRaumNameLaenge(LaengeRaumName);
                                DecodedBytes = copyOfRange(DecodedBytes, 1, DecodedBytes.length);
                                String RaumNameStr = new String();
                                for (int index = 0; index < LaengeRaumName; index++) {
                                    byte bRaumNameByte = DecodedBytes[index];
                                    RaumNameStr += (char) bRaumNameByte;
                                }
                                AktDevice.setRaumName(RaumNameStr);
                                DecodedBytes = copyOfRange(DecodedBytes, LaengeRaumName, DecodedBytes.length);
                                String RaumGroupAdress = new String();
                                for (int index = 0; index < MSG_M_ROOMRFADDRESS_LENGTH; index++) {
                                    byte bRaumRFAByte = DecodedBytes[index];
                                    RaumGroupAdress += (char) bRaumRFAByte;
                                }
                                AktDevice.setRaumRFAdresse(RaumGroupAdress);
                                CubeNetz.add(AktDevice);
                                DecodedBytes = copyOfRange(DecodedBytes, MSG_M_ROOMRFADDRESS_LENGTH, DecodedBytes.length);  // damit ist das Array verkürzt
                                // Jetzt nach einem ähnlichen Schema die Geräte den Räumen zuordnen (wobei diesmal die Räume bereits existieren)
                            }
                            Log.d("ccn", "Räume zerlegt");
                            Log.d("ccn", "Anfang Zerlegung Devices");
                            int GeraeteAnzahl = DecodedBytes[0];
                            DecodedBytes = copyOfRange(DecodedBytes, 1, DecodedBytes.length);
                            for (int GeraeteIndex = 0; GeraeteIndex < GeraeteAnzahl; GeraeteIndex++) {
                                cDevice4 AktDevice = new cDevice4();
                                AktDevice.setDeviceTypeSelector(2);
                                AktDevice.setDeviceType(DecodedBytes[0]);
                                DecodedBytes = copyOfRange(DecodedBytes, 1, DecodedBytes.length);
                                String DevRFA = new String();
                                for (int index = 0; index < MSG_M_DEVICERFA_LENGTH; index++) {
                                    byte bDevRfaByte = DecodedBytes[index];
                                    DevRFA += (char) bDevRfaByte;
                                }
                                AktDevice.setDeviceRFAddress(DevRFA);
                                DecodedBytes = copyOfRange(DecodedBytes, MSG_M_DEVICERFA_LENGTH, DecodedBytes.length);
                                // Device-Serial-Number
                                String DevSN = new String();
                                for (int index = 0; index < MSG_M_DEVICE_SERIAL_LENGTH; index++) {
                                    byte bDevSnByte = DecodedBytes[index];
                                    DevSN += (char) bDevSnByte;
                                }
                                AktDevice.setDeviceSeriennummer(DevSN);
                                DecodedBytes = copyOfRange(DecodedBytes, MSG_M_DEVICE_SERIAL_LENGTH, DecodedBytes.length);
                                // Länge Device-Name (aus 1 Zeichen)
                                int DevNameLen = DecodedBytes[0];
                                DecodedBytes = copyOfRange(DecodedBytes, 1, DecodedBytes.length);
                                String DevNameStr = new String();
                                for (int index = 0; index < DevNameLen; index++) {
                                    byte bDevNameByte = DecodedBytes[index];
                                    DevNameStr += (char) bDevNameByte;
                                }
                                AktDevice.setDeviceName(DevNameStr);
                                DecodedBytes = copyOfRange(DecodedBytes, DevNameLen, DecodedBytes.length);
                                // Device-Raum-ID
                                int DevRaumID = DecodedBytes[0];
                                AktDevice.setDeviceRoomID(DevRaumID);
                                DecodedBytes = copyOfRange(DecodedBytes, 1, DecodedBytes.length);
                                CubeNetz.add(AktDevice);
                            }
                            Log.d("ccn", "Zerlegung Devices beendet");
                            Log.d("ccn", "End case M");
                            break;
                        }

                    }
                    Log.d("ccn", "Zurück zum Switch-Case");
                }
                Log.d("ccn", "Leerzeile gefunden");
            }

            Log.d("ccn", "Schleifenlauf beendet");  //<<<<------ diese Logmeldung kriege ich nicht mehr - da läuft was falsch!!!

        } catch (FileNotFoundException e) {
            Log.d("ccn", "Fehler gefangen (FileNotFoundException)");
            e.printStackTrace();

        } catch (IOException e) {
            Log.d("ccn", "Fehler gefangen (IOException)");
            e.printStackTrace();
        }
        Log.d("ccn", "decodeMessage durchgelaufen");
    }

Jetzt muss ich herausfinden, wie ich eine solche Schleife abbrechen kann. Leider kenn ich die Anzahl der möglichen Zeilen inder Message nicht. Außerdem hatte ich gedacht, dass ich bereits alle nötigen Abfragen eingebaut habe.
Falls es hilft, hier noch die Original-Message.

H:KEQ0837268,0cd86d,0113,00000000,441229eb,00,32,100204,1313,03,0000

M:00,01,VgIFAQpXb2huemltbWVyC3GmAgxTY2hsYWZ6aW1tZXILhkADBULDvHJvC3HYBApCYWRlemltbWVyC5ILBQxHw6RzdGV6aW1tZXILYC8FAQuGQEtFUTA0NDY3NDcIU2NobGFmZW4CAQtx2EtFUTA0NDk1NDkFQsO8cm8DAQuSC0tFUTA0NDYxODADQmFkBAELcaZLRVEwNDQ5NTcwCldvaG56aW1tZXIBAQtgL0tFUTA0NTA1NjcMR8Okc3RlemltbWVyBQE=

C:0cd86d,7QzYbQATAf9LRVEwODM3MjY4AAsABEAAAAAAAAAAAP///////////////////////////wsABEAAAAAAAAAAQf///////////////////////////2h0dHA6Ly9tYXguZXEtMy5kZTo4MC9jdWJlADAvbG9va3VwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENFVAAACgADAAAOEENFU1QAAwACAAAcIA==

C:0b71a6,0gtxpgEBGP9LRVEwNDQ5NTcwLCYzCQcKA3Cr/wBMNlhuUM1ZFU0gTSBNIEUgRSBFIEUgRSBFIEw2WG5QzVkVTSBNIE0gRSBFIEUgRSBFIEUgTDZYblDNWRVNIE0gTSBFIEUgRSBFIEUgRSBMNlhuUM1ZFU0gTSBNIEUgRSBFIEUgRSBFIEw2WG5QzVkVTSBNIE0gRSBFIEUgRSBFIEUgTDZYblDNWRVNIE0gTSBFIEUgRSBFIEUgRSBMNlhuUM1ZFU0gTSBNIEUgRSBFIEUgRSBFIA==
C:0b602f,0gtgLwEFGP9LRVEwNDUwNTY3LCYzCQcKA3Cr/wBMNlhuUM1ZFU0gTSBNIEUgRSBFIEUgRSBFIEw2WG5QzVkVTSBNIE0gRSBFIEUgRSBFIEUgTDZYblDNWRVNIE0gTSBFIEUgRSBFIEUgRSBMNlhuUM1ZFU0gTSBNIEUgRSBFIEUgRSBFIEw2WG5QzVkVTSBNIE0gRSBFIEUgRSBFIEUgTDZYblDNWRVNIE0gTSBFIEUgRSBFIEUgRSBMNlhuUM1ZFU0gTSBNIEUgRSBFIEUgRSBFIA==
C:0b71d8,0gtx2AEDGP9LRVEwNDQ5NTQ5LCYzCQcKA3Cr/wBQNlhuWM5ZFU0gTSBNIEUgRSBFIEUgRSBFIFA2WG5YzlkVTSBNIE0gRSBFIEUgRSBFIEUgUDZYbljOWRVNIE0gTSBFIEUgRSBFIEUgRSBQNlhuWM5ZFU0gTSBNIEUgRSBFIEUgRSBFIFA2WG5YzlkVTSBNIE0gRSBFIEUgRSBFIEUgUDZYbljOWRVNIE0gTSBFIEUgRSBFIEUgRSBQNlhuWM5ZFU0gTSBNIEUgRSBFIEUgRSBFIA==
C:0b920b,0guSCwEEGP9LRVEwNDQ2MTgwLCYzCQcKA3Cr/wBQKlhuUM1ZFU0gTSBNIEUgRSBFIEUgRSBFIFAqWG5QzVkVTSBNIE0gRSBFIEUgRSBFIEUgUCpYblDNWRVNIE0gTSBFIEUgRSBFIEUgRSBQKlhuUM1ZFU0gTSBNIEUgRSBFIEUgRSBFIFAqWG5QzVkVTSBNIE0gRSBFIEUgRSBFIEUgUCpYblDNWRVNIE0gTSBFIEUgRSBFIEUgRSBQKlhuUM1ZFU0gTSBNIEUgRSBFIEUgRSBFIA==
C:0b8640,0guGQAECGP9LRVEwNDQ2NzQ3LCYyCQUKA3Cr/wBYKlhuVM5ZFVkgWSBZIEUgRSBFIEUgRSBFIFgqWG5UzlkVWSBZIFkgRSBFIEUgRSBFIEUgWCpYblTOWRVZIFkgWSBFIEUgRSBFIEUgRSBYKlhuVKhZFVkgWSBZIEUgRSBFIEUgRSBFIFgqWG5UzlkVWSBZIFkgRSBFIEUgRSBFIEUgWCpYblTOWRVZIFkgWSBFIEUgRSBFIEUgRSBYKlhuVJBZFVkgWSBZIEUgRSB
FIEUgRSBFIA==


L:CwtxpvESGFosALsACwtgLwMaGEssAMYACwtx2AkSGAAKAOoACwuSCwkSGE4sAL0ACwuGQAkSGAAKAPAA

Ich weiß im Lauf der Dekodierung dieser Message, wieviele Teilmessages enthalten sind - kann ich dieses Wissen evtl. irgendwie nutzen? Wenn ja, wie?

Gruss
G.-U.M.

N'y pas n'y
tu car tu
mal tu mal

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

09.08.2016, 21:42:59 via App

Wenn ich mir den Code so anschaue dann graust es mir. So etwas schätze ich als leicht fehleranfällig ein.
Aber wenn du recht hast und deine While schleife wird nicht verlassen dann liegt das an der Schleifendefinition oder am inputstream.

Du könntest mit einem Break befehl die schleife verlassen dann brauchst du aber eine EOF oder End of Stream info damit du weißt dass dir keine Daten verloren gehen.

— geändert am 09.08.2016, 21:44:03

LG Pascal //It's not a bug, it's a feature. :) ;)

Gerd-Ulrich M.

Antworten
Gerd-Ulrich M.
  • Forum-Beiträge: 770

10.08.2016, 06:50:18 via Website

Pascal P.

Wenn ich mir den Code so anschaue dann graust es mir. So etwas schätze ich als leicht fehleranfällig ein.

Da ich von der Pascal-Programmierung her komme, ist da noch viel drin das sicherlich eleganter zu lösen ist. Ausserdem ging es mir eigentlich nur um eine grundsätzliche Lösung zur Decodierung. Da muss noch einiges umgeschrieben werden.

[[cite Pascal P.]]
Aber wenn du recht hast und deine While schleife wird nicht verlassen dann liegt das an der Schleifendefinition oder am inputstream.

Du könntest mit einem Break befehl die schleife verlassen dann brauchst du aber eine EOF oder End of Stream info damit du weißt dass dir keine Daten verloren gehen.

Also sowas ähnliches wie ich mir schon gedacht habe.
Das muss ich mir erstmal angucken.
Danke und Gruß
G.-U. M.

N'y pas n'y
tu car tu
mal tu mal

Antworten
swa00
  • Forum-Beiträge: 3.704

10.08.2016, 08:46:38 via Website

Moin Gerd,

ich fliege bei euch beiden nur über die Einträge drüber , habe mich also nicht so damit auseinander gesetzt , wie Pascal es tut.

Eines ist mir jedoch als alter C'ler aufgefallen :

Du machst Deine Schleife von

while ((MessageZeile = br.readLine()) != null) {

abhängig .

Das ist auch bei C tötlich , wenn am Ende der Datei kein REINES CRLF folgt und du damit die "Leere" abfangen kannst.
Dann du wirst auch kein EOF bekommen .

In so einem Falle solltest du immer Byte-Blockweise einlesen und den Input selbst parsen.
- BufferReader.read();
Das ist wie bei einem Binary-Stream ( z.b seriellen/BT), bei dem keine Zeilenabschlüsse kommen oder verloren gehen.

Ich wage mal zu orakeln , wenn du zum Test der InputDatei am Ende zwei Enter reinhaust , dass es dann gehen wird.
.

Ansonsten muss ich Pascal recht geben , ein wenig "gewöhnungsbedürftig" dein Code :-) (Auch aus C sicht) :-)

— geändert am 10.08.2016, 10:05:48

Liebe Grüße - Stefan
[ App - Entwicklung ]

Gerd-Ulrich M.

Antworten
Gerd-Ulrich M.
  • Forum-Beiträge: 770

10.08.2016, 09:22:22 via Website

swa00

Moin Gerd,

ich fliege bei euch beiden nur über die Einträge drüber , habe mich also nicht so damit auseinander gesetzt , wie Pascal es tut.

Eines ist mir jedoch als alter C'ler aufgefallen :

Du machst Deine Schleife von

while ((MessageZeile = br.readLine()) != null) {

abhängig .

Ja, da ich bisher kein anderes brauchbares Kriterium gefunden hatte.

[[cite swa00]]
Das ist auch bei C tötlich , wenn am Ende der Datei kein REINES CRLF folgt.
Dann du wirst auch kein EOF bekommen .

Ah, das ist mal eine Aussage. Sehr schön.

swa00

In so einem Falle solltest du Byte-Blockweise einlesen und den Input selbst parsen.
Das ist wie bei einem Binary-Stream ( z.b seriellen/BT), bei dem keine Zeilenabschlüsse kommen.

Ich wage mal zu orakeln , wenn du zum Test der InputDatei am Ende zwei Enter reinhaust , dass es dann gehen wird.
.

Das sollte sich machen lassen. Zumindest für den Test - dann komme ich hoffentlich weiter.

[[cite swa00]]
Ansonsten muss ich Pascal recht geben , ein wenig "gewöhnungsbedürftig" dein Code :-) (Auch aus C sicht) :-)

Ich geb's zu, ihr habt mich erwischt :$ Ich hatte das ganze erst in Pascal programmiert und dann von da aus mehr oder weniger direkt "übersetzt". Eigentlich hatte ich ja auch an dieser Stelle keine Probleme erwartet. Der Code steht auf jeden Fall noch auf der ToDo-Liste für die Überarbeitung. Ich hatte ja schon zugegeben, dass das alles noch nicht "Java-like" geschrieben ist.

Gruss
G.-U.M.

N'y pas n'y
tu car tu
mal tu mal

Antworten
swa00
  • Forum-Beiträge: 3.704

10.08.2016, 09:47:20 via Website

Dann mal viel Erfolg ..

Nur so nebenbei , weil der Eingangsthread sich ja auf Async bezogen hat :

Grundsätzlich immer genestete Funktionen, die in einem Async verwendet werden sollen , voher nackt
fertigstellen und dann erst im Async verbauen ...

Liebe Grüße - Stefan
[ App - Entwicklung ]

Gerd-Ulrich M.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

10.08.2016, 10:18:22 via App

Das funktioniert aber nur bedingt. In Android gibt es da ohne Async eine Network on ManThread exception wenn man sowas macht. Man kann zwas den StrictMode abschalten aber das ist auch nicht das beste.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gerd-Ulrich M.
  • Forum-Beiträge: 770

10.08.2016, 10:30:11 via Website

swa00

Dann mal viel Erfolg ..

Der wird sich hoffentlich irgenwann mal einstellen....ich hab zum Glück Zeit zum in Ruhe lernen ;)

Nur so nebenbei , weil der Eingangsthread sich ja auf Async bezogen hat :

Grundsätzlich immer genestete Funktionen, die in einem Async verwendet werden sollen , voher nackt
fertigstellen und dann erst im Async verbauen ...

Diese offensichtlich goldene Regel werde ich beim nächsten Mal beherzigen. Diesmal hatte ich am Anfang nicht mal an einen AsyncTask gedacht, bis mich Android Studio drauf hinwies, dass ich Netzwerk-Verbindungen immer über einen AsyncTask abzuwickeln hätte. Und da ich am Ende genau diese Netzwerk-Verbindung haben möchte, habe ich natürlich den AsyncTask eingeführt - ohne über die Folgen nachzudenken (ist das erste Mal dass ich mit AsyncTasks arbeite).

Gruss
G.-U.M.

N'y pas n'y
tu car tu
mal tu mal

Antworten
swa00
  • Forum-Beiträge: 3.704

10.08.2016, 10:36:11 via Website

@Gerd

ich sehe in deinem Code auch folgendes

Log.d("ccn", "Leerzeile gefunden");

Nur damit wir uns nicht falsch verstehen :

Der Test, am ende der InputDatei zwei CRLF reinzuhauen, soll dir nur bestätigen , dass du alles gelesen hast ( also auch die letzen gültigen Daten)
Da du aber auch nicht abbrichst , wenn nur ein CRLF da ist , wirst du natürlich auch hier nicht das Ende der Datei finden und endlos bleiben.

Dir bleibt also nichts anderes übrig - wie oben angeraten - blockweise einzulesen und selbst zu parsen

Bsp :

int bytes_gelesen = br.read (buffer,0,1024);
if (bytes_gelesen == -1)
{
Boolean NixMehrDa = true;
DateiZuUndRausHier = true;
}
else
{
JetztWirdsLustigmitStückelnUndParsen = true;
}

— geändert am 10.08.2016, 10:58:35

Liebe Grüße - Stefan
[ App - Entwicklung ]

Gerd-Ulrich M.

Antworten
Gerd-Ulrich M.
  • Forum-Beiträge: 770

10.08.2016, 10:50:38 via Website

swa00

@Gerd

ich sehe in deinem Code auch folgendes

Log.d("ccn", "Leerzeile gefunden");

Nur damit wir uns nicht falsch verstehen :

Der Test, am ende der InputDatei zwei CRLF reinzuhauen, soll dir nur bestätigen , dass du alles gelesen hast ( also auch die letzen gültigen Daten)
Da du aber auch nicht abbrichst , wenn nur ein CRLF da ist , wirst du natürlich auch hier nicht das Ende der Datei finden und endlos bleiben.

Das habe ich schon so verstanden. Der Log-Eintrag war ja auch schön gemeint, aber nützen tut er mir nichts. Betrachte ihn als Überbleibsel.

Dir bleibt also nichts anderes übrig - wie oben angeraten - blockweise einzulesen und selbst zu parsen

Das werde ich tun.

Gruss
G.-U.M.

N'y pas n'y
tu car tu
mal tu mal

Antworten
Gerd-Ulrich M.
  • Forum-Beiträge: 770

10.08.2016, 11:10:00 via Website

Sorry, wenn ich selbst noch antworte, aber:
Ich habe eben festgestellt, dass die von mir decodierten "Messages" bis auf eine einzige immer nur einmal vorkommen und auch in festgelegter Reihenfolge. Die "C"-Message kommt so oft vor, wie vorher innerhalb der "M"-Message angegeben (wird indirekt über die dort aufgeführten "Thermostate" angegeben.
Das heißt, spätestens hier weiß ich, wieviele Zeilen ich zu lesen habe - ich muss mal gucken, ob sich aus diesem Wissen nicht eine Abbruchbedingung herleiten lässt. Ist natürlich gefährlich wenn sich das Protokoll ändert - aber als Rückfall-Ebene evtl. trotzdem zu gebrauchen.

Frage daher: Aus einer While-Schleife komme ich mit einem Breakheraus? Das Breakbeendet einen Anweisungsblock, d.h. alle innerhalb der While-Schleife deklarierten Variablen sind anschließend undefiniert? Richtig?

Danke und Gruss
G.-U.M.

N'y pas n'y
tu car tu
mal tu mal

Antworten
swa00
  • Forum-Beiträge: 3.704

10.08.2016, 11:16:10 via Website

Wie du schon richtig festgestellt hast :

Ändert sich was, musst du nochmal ran - bist zwar jetzt schneller am Ziel , ist aber nicht das Wahre.
Ich würde mir die Zeit nehmen und es "globaler" und vernünftig gestalten.

Die wirkliche Arbeit kommt meistens erst dann , wenn sich mal was ändert -

Zu deiner Frage : idR Yupp

— geändert am 10.08.2016, 11:28:50

Liebe Grüße - Stefan
[ App - Entwicklung ]

Gerd-Ulrich M.

Antworten
swa00
  • Forum-Beiträge: 3.704

10.08.2016, 11:38:16 via Website

Nachtrag ...

ich orakle auch hier , dass Du jetzt anfängst globale Variablen zu deklarieren, damit dir ggf Werte Klassenübergreifend zur Verfügung stehen .

Wenn man von Pascal / C etc kommt neigt man dazu , diese jetzt in Java teilweise als "static" zu deklarieren ..

Bevor du damit anfängst , zieh dir bitte mal diesen Artikel rein , nicht dass du irgendwann mal deine Überraschung erlebst

https://androidresearch.wordpress.com/2012/03/22/defining-global-variables-in-android/

You may believe that when a static variable is initialized it stays so for the entire life of the application, however this does not seem to be true everytime. Sometimes, there are situations when some static variables bound to activities happens to be uninitialized even they have been initialized.

— geändert am 10.08.2016, 11:45:40

Liebe Grüße - Stefan
[ App - Entwicklung ]

Gerd-Ulrich M.

Antworten
Gerd-Ulrich M.
  • Forum-Beiträge: 770

10.08.2016, 12:31:24 via Website

In diesem Fall liegt das Orakel gar nicht so schlecht....aber ich habe schon gemerkt , dass static-Deklarationen nicht immer so funktionieren, wie ich das gewöhnt bin.

Ich werde den Artikel gern lesen, schließlich will ich die Sprache soweit beherrschen, dass ich beim nächsten Projekt nicht wieder über vergleichsweise Kleinigkeiten "stolpere".

Danke und Gruss
G.-U.M.

N'y pas n'y
tu car tu
mal tu mal

Antworten
swa00
  • Forum-Beiträge: 3.704

10.08.2016, 12:35:23 via Website

@Gerd

Nur so nebenbei - wir würden uns auch herzlichst über ein paar "Danke" Klicks freuen :-)

— geändert am 10.08.2016, 13:46:08

Liebe Grüße - Stefan
[ App - Entwicklung ]

Pascal P.

Antworten
Gerd-Ulrich M.
  • Forum-Beiträge: 770

10.08.2016, 13:58:45 via Website

Danke für den Zaunpfahl (laughing)

Normalerweise sag ich fast immer brav "Bitte" und "Danke" :D

N'y pas n'y
tu car tu
mal tu mal

swa00

Antworten
Gerd-Ulrich M.
  • Forum-Beiträge: 770

11.08.2016, 20:31:25 via Website

swa00

@Gerd

ich sehe in deinem Code auch folgendes

Log.d("ccn", "Leerzeile gefunden");

Das hat sich inzwischen erübrigt. Ich hab mir den Original-Output meines Heizungs-Gateways nochmal angesehen - da gibts keine Leerzeile. Fehler auch schon gefunden: Ich hatte irgendwann zu Anfang mal den gespeicherten Output zur besseren Übersicht mit Leerzeilen versehen und dann später so in meinen "Gateway-Simulator" eingespeist. Und das hat sich nun immer weiter mitgezogen. :(

[[cite swa00]]
Dir bleibt also nichts anderes übrig - wie oben angeraten - blockweise einzulesen und selbst zu parsen

Bsp :

int bytes_gelesen = br.read (buffer,0,1024);
if (bytes_gelesen == -1)
{
Boolean NixMehrDa = true;
DateiZuUndRausHier = true;
}
else
{
JetztWirdsLustigmitStückelnUndParsen = true;
}

Diese Möglichkeit prüfe ich gerade. Denn meine andere Idee (die mit der Nutzung der Zähler) hat sich als nicht praktikabel erwiesen.
Und da ich sowieso byteweise lesen und interpretieren muss, könnte ich (aktueller, noch nicht ausgereifter und auf alle "Haken und Ösen" abgeklopfter Gedankengang) den vom Socket gelieferten InputStream nutzen und bis InputStream.Size (oder wie die Methode heißen wird) lesen.

Mal sehen, wann ich dazu komme (ich möchte zwar voran kommen, aber es gibt immer noch andere SAchen die auch wichtig sind).

Gruss
G.-U.M.

N'y pas n'y
tu car tu
mal tu mal

Antworten
Gerd-Ulrich M.
  • Forum-Beiträge: 770

12.08.2016, 07:07:12 via Website

Danke an alle Mitdenker und Tippgeber! Es läuft wie gewünscht.
Der entscheidende Tipp/Trick war der Hinweis auf die Zeile

Log.d("ccn", "Leerzeile gefunden");

Genau diese Leerzeile ist keine (nach der Anpassung meines "Gateway-Simulators"), sondern das Ende der Message.
Ich brauche also nur genau diese Prüfung und da dann mit Break"raus".
Jetzt kann ich weitermachen.
Danke....ich mach hier dann auch zu.
Gruss
G.-U.M.

N'y pas n'y
tu car tu
mal tu mal

swa00

Antworten