2011-10-19 69 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