2012-04-04 23 views
6

Moja aplikacja ma pewne działania, które w pierwszym łączę gniazdo do komunikacji z serwerem w innych działaniach. To gniazdo działa w wątku roboczym.Zamknij gniazdo po zakończeniu aplikacji

Moje pytanie brzmi: gdzie mogę zamknąć to gniazdo po zakończeniu aplikacji? Za pomocą przycisku BACK na przykład ...

Myślałem zamknąć gniazdo w onDestroy() ostatniego działania, ale działanie to może zostać zniszczone przez system w czasie wykonywania i zamknąć gniazdo, nawet jeśli aplikacja nie kończy. Nie chcę tego.

Moja run() metoda obsługi połączenia z gniazdem wątku jest jak:

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 
      } 
     } 
    } 

Ale blok finally nigdy nie jest wywoływana.

Czy ktoś może dać mi wskazówkę?

+0

nigdy nie przestajesz 'run' lub wątek zostanie zabity. Obsługa sieci wymagana przez wiele działań brzmi jak dobre miejsce, aby przenieść to do usługi. – zapl

+0

@zapl, połączenie TCP działa poprawnie. Mogę poprawnie odbierać i wysyłać dane ... Jedynym moim problemem jest zamknięcie gniazda, ponieważ serwer również musi zamknąć to gniazdo. – amp

Odpowiedz

4

Blok finally nigdy nie jest wykonywany, ponieważ pętla uruchamiania nigdy się nie kończy. W pewnym momencie system Android po prostu zabija proces, który zabija VM i wszystko po prostu znika.

Jeśli masz aplikację, która zawiera tylko czynności i robisz sieciowe operacje we/wy w osobnym wątku, nie ma możliwości, aby wiedzieć, kiedy zamknąć wątek, ponieważ "aplikacja" nigdy nie jest "ukończona" . Musisz określić sposób, w jaki aplikacja "kończy".

Lepszym sposobem jest umieszczenie tego w usłudze, ponieważ jeśli Android chce zabić proces, najpierw wywoła funkcjęDestroy() w usłudze, co da ci szansę na prawidłowe zamknięcie wątku.

Powiązane problemy