关闭应用程序时关闭套接字。

6
我的应用程序有一些活动,其中在第一个活动中我连接一个套接字以与其他活动上的服务器通信。这个套接字在工作线程中运行。
我的问题是:当应用程序结束时,我在哪里可以关闭此套接字?例如使用后退按钮...
我曾想在最后一个活动的 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块从未被调用。

有人能给我一些提示吗?


你永远不要停止 running,否则线程会被杀死。处理多个活动所需的网络处理似乎是将其转移到服务中的好地方。 - zapl
@zapl,TCP连接工作正常。我可以正确地接收和发送数据... 我唯一的问题是关闭套接字,因为服务器也需要关闭此套接字。 - amp
1个回答

5
finally块永远不会被执行,因为运行循环从未完成。在某个时刻,Android只是杀掉了进程,这将导致VM和所有内容都消失。

如果您的应用程序只包含活动,并且您正在单独的线程中进行网络I/O,则无法知道何时关闭该线程,因为“应用程序”从未“完成”。您需要定义应用程序的“完成”方式。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接