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

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

我以为在上一个 Activity 的onDestroy()中关闭套接字,但是即使在应用程序未完成的情况下,该 Activity 也可能在系统运行时被系统破坏并关闭套接字。我不要这个

我处理套接字连接的线程的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块。

谁能给我一些提示吗?

最佳答案

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

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

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

10-07 18:52
查看更多