1

我正在开发一个使用此线程运行服务的 Android 3.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

根据close方法的javadoc

当前在此套接字上的 I/O 操作中阻塞的任何线程都将抛出 SocketException。

因此,当您调用close,时socket.receive(packet);,如果它当前处于阻塞模式,将抛出一个SocketException在您的块中捕获的catch (IOException e)并打印堆栈跟踪。

于 2012-07-04T08:39:47.367 回答
3

这个异常唯一真正的问题是你不能轻易地将它与实际的 I/O 错误区分开来。我建议切换到使用 SocketChannel 而不是 Socket——然后你可以中断你的服务器线程,它会抛出一个 ClosedByInterruptException ,你可以专门捕获和处理它。

于 2012-07-04T08:45:37.357 回答