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

関連する問題