android - 完成应用程序时关闭套接字

标签 android sockets

我的应用程序有一些 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 block 永远不会被调用。

谁能给我一些提示?

最佳答案

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

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

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

关于android - 完成应用程序时关闭套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10019934/

相关文章:

java - 自定义 CoordinatorLayout 行为在第一个事件后丢失触摸输入流

android - 跳棋类游戏的棋盘布局(屏幕上的多个 View 等)

ruby - Socket 是否与 Pry 捆绑在一起?

javascript - 如何使用需要套接字连接的中间件?

C++ 套接字编程、带压缩的多播、任何好的库/包装器?

c - c中的DNS客户端程序

android - 地理定位不起作用 ionic 3 - android

android - Out of Memory - 内存优化

java - 如何在android中获取正确的路径文件

android - 从套接字而不是 SocketServer 上的字符串接收十六进制值