我有一个用于维护与服务器连接的线程。如果用户退出应用程序上的服务(但没有退出应用程序),我需要一种方法来终止线程并确保它真的消失了。目前,与服务器的连接是通过长轮询(a.k.a,Comet架构)完成的。如果我使用“interrupt”来终止线程,那么仍然会建立与服务器的底层连接。线程始终保留在内存中。似乎没有任何方法可以强制套接字关闭。
如果用户在注销后立即重新登录,则会与服务器建立新连接。但是,由于套接字未被释放,旧连接仍处于活动状态。我发现如果我转到Android的设置>应用程序>管理应用程序并强制关闭并重新启动应用程序,连接线程实际上已终止,并且我再次连接到服务器时没有问题。
有没有办法在退出后终止线程,以便它真的被迫终止?使用System.GC()没有帮助。
答案 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();
}
}
这终于解决了我挥之不去的线程问题。希望这有帮助!