【问题标题】:Close socket when finishing application完成应用程序时关闭套接字
【发布时间】:2012-04-04 22:06:04
【问题描述】:

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

我的问题是:应用程序完成后我在哪里可以关闭这个套接字?例如使用 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 块永远不会被调用。

谁能给我一些提示?

【问题讨论】:

  • 你永远不会停止running 否则线程会被杀死。多个活动所需的网络处理听起来像是将其移入服务的好地方。
  • @zapl,TCP 连接工作正常。我可以正常接收和发送数据......我唯一的问题是关闭套接字,因为服务器也需要关闭这个套接字。

标签: android sockets


【解决方案1】:

finally 块永远不会执行,因为运行循环永远不会完成。在某些时候,Android 会终止进程,这会终止 VM,然后一切都会消失。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 2012-02-08
    • 1970-01-01
    相关资源
    最近更新 更多