6

私のアプリケーションにはいくつかのアクティビティがあり、最初のアクティビティでは、他のアクティビティでサーバーと通信するためにソケットを接続します。このソケットはワーカースレッドで実行されます。

私の質問は、アプリケーションが終了したときにこのソケットをどこで閉じることができるかということです。たとえば、[戻る]ボタンを使用して...

最後のアクティビティのソケットを閉じると思いましたonDestroy()が、このアクティビティは実行時にシステムによって破棄され、アプリケーションが終了していなくてもソケットを閉じることができます。これは欲しくない。

run()ソケット接続を処理するスレッドの私の方法は次のようになります。

public void run() { 
    if (this.bliveclient.isConnected()){       
        try {
            //...
            while (running) {
                //waiting for input data and do something...
            }
        }
        catch (IOException ex) {
            //handle exception
        }
        finally{
            try {
                mySocket.close();
            } catch (IOException ex) {
                //handle exception
            }
        }
    }

ただし、finallyブロックが呼び出されることはありません。

誰かが私にいくつかのヒントを与えることができますか?

4

1 に答える 1

5

finally実行ループが完了しないため、ブロックが実行されることはありません。ある時点で、Androidはプロセスを強制終了し、VMを強制終了し、すべてが消えます。

アクティビティのみを含むアプリケーションがあり、別のスレッドでネットワークI / Oを実行している場合、「アプリケーション」は「終了」しないため、スレッドをいつシャットダウンするかを知る方法はありません。アプリケーションがどのように「終了」するかを定義する必要があります。

より良い方法は、これをサービスに入れることです。Androidがプロセスを強制終了する場合、最初にサービスでonDestroy()を呼び出し、スレッドを適切にシャットダウンする機会を提供します。

于 2012-05-31T18:00:48.733 に答える