1

このスレッドでサービスを実行するAndroid3.1タブレットアプリケーションを開発しています。

public class UDPServerThread extends Thread
{
    [ ... ]

    public void run()
    {
        while (!end)
        {
            try
            {
                byte[] buf = new byte[MESSAGE_SIZE];

                // Wait an incoming message.
                DatagramPacket packet = new DatagramPacket(buf, buf.length);
                socket.receive(packet);
                // TODO: Notify Service with packet received
                Message msg = new Message();
                msg.obj = packet;
                mServiceHandler.sendMessage(msg);
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    public void stopServer()
    {
        Log.v("UDPServerThread", "stopServer");
        if (socket != null)
            socket.close();
        end = true;
    }
}

サービスからメソッドを呼び出すとstopServer()、次のエラーが発生します。

java.net.SocketException: Interrupted system call

オンのときにこのスレッドを停止する正しい方法はどれsocket.receive(packet);ですか?

4

2 に答える 2

3

この例外の唯一の問題は、実際の I/O エラーと簡単に区別できないことです。Socket ではなく SocketChannel を使用するように切り替えることをお勧めします。サーバー スレッドを中断すると、代わりに ClosedByInterruptException がスローされます。これをキャッチして具体的に処理できます。

于 2012-07-04T08:45:37.357 に答える
3

close メソッドのjavadocによると:

このソケットの I/O 操作で現在ブロックされているスレッドは、SocketException をスローします。

したがって、 を呼び出すcloseと、socket.receive(packet);現在ブロック モードになっている場合はSocketException、ブロックにキャッチされたがスローcatch (IOException e)され、スタック トレースが出力されます。

于 2012-07-04T08:39:47.367 に答える