2012-04-04 9 views
6

Meine Anwendung habe einige Aktivitäten, die in der ersten einen Socket verbinden, um mit einem Server auf den anderen Aktivitäten zu kommunizieren. Dieser Socket wird in einem Worker-Thread ausgeführt.Schließen Sie die Steckdose beim Beenden der Anwendung

Meine Frage ist: Wo kann ich diese Buchse schließen, wenn die Anwendung fertig ist? Mit der BACK-Taste zum Beispiel ...

Ich dachte, schließen Sie den Socket in onDestroy() der letzten Aktivität, aber diese Aktivität kann durch das System zur Laufzeit zerstört werden und schließen Sie den Socket, auch wenn die Anwendung nicht fertig ist. Ich will das nicht.

Meine run() Methode der Thread die Anschlussbuchse Handhabung ist wie:

public void run() { 
    if (this.bliveclient.isConnected()){  
     try { 
      //... 
      while (running) { 
       //waiting for input data and do something... 
      } 
     } 
     catch (IOException ex) { 
      //handle exception 
     } 
     finally{ 
      try { 
       mySocket.close(); 
      } catch (IOException ex) { 
       //handle exception 
      } 
     } 
    } 

Aber der finally Block wird nie aufgerufen.

Kann mir jemand einen Tipp geben?

+0

Sie hören nie auf zu rennen oder der Thread wird getötet. Die Netzwerkverwaltung, die für mehrere Aktivitäten erforderlich ist, klingt nach einem guten Ort, um sie in einen Dienst zu verschieben. – zapl

+0

@zapl, Die TCP-Verbindung funktioniert einwandfrei. Ich kann Daten richtig empfangen und senden ... Mein einziges Problem ist das Schließen des Sockets, da der Server diesen Socket ebenfalls schließen muss. – amp

Antwort

4

Der finally-Block wird niemals ausgeführt, da die Ausführungsschleife niemals abgeschlossen wird. Irgendwann tötet Android einfach den Prozess, was die VM umbringt und alles verschwindet.

Wenn Sie eine Anwendung haben, die nur Aktivitäten enthält und Sie Netzwerk-E/A in einem separaten Thread ausführen, können Sie nicht wissen, wann der Thread heruntergefahren werden soll, da die "Anwendung" niemals "fertig" ist . Sie müssen definieren, wie die Anwendung "beendet" wird.

Ein besserer Weg ist es, dies in einen Dienst zu stellen, denn wenn Android den Prozess beenden will, ruft er zuerst onDestroy() im Dienst auf, was Ihnen die Möglichkeit gibt, den Thread ordnungsgemäß herunterzufahren.

Verwandte Themen