2012-04-04 33 views
6

我的應用程序有一些活動,它們在第一個連接一個套接字與其他活動上的服務器進行通信。該套接字在工作線程中運行。完成應用程序時關閉套接字

我的問題是:在應用程序完成後,我可以在哪裏關閉此套接字?例如使用BACK按鈕...

我以爲關閉了上一個活動的onDestroy()的套接字,但是這個活動可以在運行時被系統破壞,並且即使應用程序沒有完成也會關閉套接字。我不想要這個。

run()線程處理socket連接的方法是這樣的:

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

finally塊永遠不會被調用。

任何人都可以給我一些提示嗎?

+0

你永遠不會停止'running'或線程被殺死。多個活動所需的網絡處理聽起來像是將它轉移到服務中的好地方。 – zapl 2012-04-04 22:14:28

+0

@zapl,TCP連接工作正常。我可以正確接收和發送數據......我唯一的問題是關閉套接字,因爲服務器也需要關閉此套接字。 – amp 2012-04-04 22:27:20

回答

4

finally塊永遠不會執行,因爲運行循環從未完成。在某個時候,Android只是殺死了這個過程,這會殺死虛擬機,一切都會消失。

如果您有一個應用程序只包含活動,並且您正在一個單獨的線程中執行網絡I/O,則無法知道何時關閉線程,因爲「應用程序」從未「完成」 。您需要定義應用程序「完成」的方式。

更好的方法是把它放到服務中,因爲如果Android想要終止進程,它將首先在服務中調用onDestroy(),這會讓你有機會正確關閉你的線程。

相關問題