Android:使用套接字连接终止线程

时间:2011-10-19 14:24:43

标签: android multithreading terminate

我有一个用于维护与服务器连接的线程。如果用户退出应用程序上的服务(但没有退出应用程序),我需要一种方法来终止线程并确保它真的消失了。目前,与服务器的连接是通过长轮询(a.k.a,Comet架构)完成的。如果我使用“interrupt”来终止线程,那么仍然会建立与服务器的底层连接。线程始终保留在内存中。似乎没有任何方法可以强制套接字关闭。

如果用户在注销后立即重新登录,则会与服务器建立新连接。但是,由于套接字未被释放,旧连接仍处于活动状态。我发现如果我转到Android的设置>应用程序>管理应用程序并强制关闭并重新启动应用程序,连接线程实际上已终止,并且我再次连接到服务器时没有问题。

有没有办法在退出后终止线程,以便它真的被迫终止?使用System.GC()没有帮助。

1 个答案:

答案 0 :(得分:0)

我所做的是添加一个名为killRequest的布尔标志或者包含在长时间循环中的东西。例如:

//long running loop in thread:
while (someMainLoopCondition && !killRequest)
{
     //do stuff;

}

还创建一个方法来更改线程内的标志:

public requestTermination()
{
     killRequest = true;
}

然后你可以打电话

myThread.requestTermination();

或创建一个清理方法:

private void KillNetworkThread(boolean b)
            {
                    if (nThread != null) { // If the thread is currently running, close the socket and interrupt it.
                            try {
                                    nThread.requestTermination();
                                    nis.close();
                                    nos.close();
                                    nsocket.close();
                            } catch (Exception e) {
                            }
                            Thread moribund = nThread;
                            nThread = null;
                            moribund.interrupt();
                    }

            }

这终于解决了我挥之不去的线程问题。希望这有帮助!