我的应用程序有一些 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(),这将使您有机会正确关闭线程。