2012-04-04 70 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(),这会让你有机会正确关闭你的线程。