2011-10-19 30 views
2

我有一个线程用于维护到服务器的连接。如果用户退出应用程序的服务(但不退出应用程序),我需要一种方法来终止线程并确保它确实消失。就目前而言,通过长轮询(a.k.a,Comet体系结构)完成到服务器的连接。如果我使用“中断”来终止线程,则仍然会建立到服务器的底层连接。线程始终保留在内存中。似乎没有任何强制关闭套接字的方法。Android:终止与套接字连接的线程

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

是否有某种方式在签出后终止线程,以便它真的被迫终止?使用System.GC()不起作用。

回答

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(); 
        } 

      } 

这终于解决了m萦绕着线程问题。希望这可以帮助!

+0

对不起,但我没有指出我使用HttpClient,所以我没有直接访问套接字。我尝试使用httpClient.getConnectionManager()。shutdown()但没有帮助。 – AndroidDev

+0

你能发布与你的问题相关的代码吗?你现在怎么试图关闭这个线程? – Jack