6

我的应用程序有一些活动,在第一个活动中,我连接了一个套接字以在其他活动上与服务器进行通信。此套接字在工作线程中运行。

我的问题是:应用程序完成后我在哪里可以关闭这个套接字?例如,使用 BACK 按钮...

我想关闭onDestroy()最后一个活动的套接字,但是这个活动可以在运行时被系统破坏并关闭套接字,即使应用程序没有完成。我不想要这个。

run()处理套接字连接的线程方法如下:

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块永远不会被调用。

谁能给我一些提示?

4

1 回答 1

5

finally块永远不会执行,因为运行循环永远不会完成。在某些时候,Android 只是杀死了进程,这会杀死 VM,一切都消失了。

如果您有一个只包含活动的应用程序,并且您在单独的线程中执行网络 I/O,那么您将无法知道何时关闭线程,因为“应用程序”永远不会“完成”。您需要定义应用程序如何“完成”。

更好的方法是将其放入 Service 中,因为如果 Android 想要终止该进程,它将首先在 Service 中调用 onDestroy() ,这将使您有机会正确关闭线程。

于 2012-05-31T18:00:48.733 回答