2011-10-19 3 views
2

서버 연결을 유지하는 데 사용되는 스레드가 있습니다. 사용자가 앱의 서비스에서 로그 아웃하면 (앱을 종료하지는 않지만) 스레드를 종료하고 실제로 사라 졌는지 확인해야합니다. 서서히 말하면, 서버에 대한 연결은 긴 폴 (a.k.a, 코멧 아키텍처)을 통해 수행됩니다. "인터럽트"를 사용하여 스레드를 종료하면 서버에 대한 기본 연결이 계속 수행됩니다. 스레드는 항상 메모리에 남아 있습니다. 소켓을 강제로 닫을 방법이없는 것 같습니다.Android : 소켓 연결로 스레드 종료

사용자가 로그 아웃 한 후 바로 로그인하면 서버에 새로운 연결이 설정됩니다. 그러나 소켓이 해제되지 않아 이전 연결은 여전히 ​​활성 상태입니다. Android에 설정> 응용 프로그램> 응용 프로그램 관리로 이동하여 응용 프로그램을 닫고 다시 시작하면 연결 스레드가 실제로 종료되고 서버에 다시 연결하는 데 문제가 없음을 발견했습니다.

로그 아웃 한 후 스레드를 종료하는 방법이있어 실제로 강제 종료 될 수 있습니까? System.GC()를 사용하면 도움이되지 않습니다.

답변

0

내가하고있는 것은 killRequest라는 부울 플래그를 추가하거나 장기 실행 루프에 통합 된 것입니다. 예를 들어 :

public requestTermination() 
{ 
    killRequest = true; 
} 

는 그런 다음

myThread.requestTermination(); 

전화하거나 당신을 위해 정리하는 방법을 만들 수 있습니다 :

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

} 

또한 스레드 내부 플래그를 변경하는 방법을 만들

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