Thread bekommt aktuellen Zustand von Socket.isConnected mit. Was mach ich falsch?

  • Hallo Zusammen,
    ich bin recht neu in der Android App Entwicklung und habe nun das Problem das ich das Starten einen Threads ohne weiteres hin bekomme. Auch das beenden per Variable klappt. Nur wenn ich anstatt der Variable keepRunning es mit "client.isConnected()" passiert nix.

    hier meine Deklarationen alle in der Klasse aber in keiner Funktion:
    privatevolatilebooleankeepRunning;
    Socket client; //auch mit volatile davor klappt es nicht

    Hier der Thread: 

    Runnable TCP_POLL =

    new Runnable() {
    @Override
    publicvoid run() {
    Log.d(TAG, "run()-Methode für Polling wurde aufgerufen");
    while(keepRunning){ //kann auch wärend der Thread läuft auf False gesetzt werden und der Thread Stopt
    //while(client.isConnected()){ //hier interessiert den Thread nur der Zustand beim Starten :(
    Log.d(TAG,"Check TCP RxBuffer");
    if (client.isConnected() == true) Log.d(TAG, "1");
    if (client.isConnected() == false) Log.d(TAG, "0");
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e){
    // Unterbrechen ingnorieren
    }
    }
    }
    };

  • Dann frag ich mal, wann/wo du die Connection beendest - vielleicht passiert das ja viel später, als du denkst.

    Üblicherweise benutzt man für solche Threads eine eigene boolean-Variable und verläßt sich nicht auf die Connection - denn oftmals sollen Threads weiterlaufen, auch wenn die zugehörige Activity aus welchen Gründen auch immer gerade mal nicht auf dem Schirm ist.

    Das Leben kann so hart sein, man muss nur richtig wollen!!!

  • Die Verbindung habe ich auch beide mögliche Wege unterbrochen.

    1. per Button klappt was ich auf der Server Seite merke (VB .net Test Programm)


    if

    (client.isConnected()) {
    keepRunning = false
    ; //unschöne Lösung zum beenden des Poll Threads
    try {
    client.close();
    } catch (IOException e) {
    //
    TODO Auto-generated catch block
    e.printStackTrace();

    2. Per beenden des Servers.

  • Hmm verstehe dein Problem nicht ganz, warum willst du die Variable nicht nutzen ???

    volatile boolean - ist ja der richtige Weg, damit die Variable threadsicher bleibt

    ob das mit einer Socket geht weiss ich nicht, (volatile)

  • Vielleicht solltest du deinem Poll-Thread eine fireUp und shootDown (oder wie auch immer *g*) spendieren, mit der du die boolean-Variable hinter einem Funktionsaufruf versteckst. Aber ich kann killphil nur zustimmen, du solltest die boolean wirklich behalten...

    Mit den Methoden kannst du dann auch den Thread erst mal beenden (vielleicht passiert da ja noch was, was du aufräumen möchtest), bevor du die Verbindung kappst.

    sleep() ist ja leider etwas unkontrolliert - dafür vielleicht einen SleepHandler basteln, der sich mit sendMessageDelayed regelmäßig in den Hintern treten läßt und zum Beenden einfach removeMessage aufruft.

    Das Leben kann so hart sein, man muss nur richtig wollen!!!

    2 Mal editiert, zuletzt von UweApps (18. Februar 2012 um 20:51)

  • Wenn ich davon ausgehe das der Sercer sich nie trennt gut. Aber wer ändert meine keepalive Variable wenn die Verbindung unerwartet unterbrochen wird. Wie stehen meine Chancen in meinem Thread Streams zu lesen und zu schreiben?

  • Jetzt kommen wir der Sache anscheinend näher: du willst was vom Internet laden und fürchtest den Verbindungsabbruch?

    Das Unterbrechen passiert nicht unerwartet - dafür gibt's normalerweise eine IOException oder so beim Netzwerkzugriff - oder nicht?

    Keine Exception => kein Ladefehler - so ist zumindest der Grundgedanke. Du kannst dann also direkt weiterarbeiten...

    Und willst du immer wieder laden oder vielleicht nach drei erfolglosen Versuchen erst mal 5 Minuten Pause einlegen?

    Das Leben kann so hart sein, man muss nur richtig wollen!!!

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!