我正在开发一个使用此线程运行服务的Android 3.1 Tablet应用程序:
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);
上停止的正确方法是什么?
答案 0 :(得分:3)
根据javadoc of the close method:
此套接字上的I / O操作中当前阻塞的任何线程都将抛出SocketException。
因此,当您致电close
,socket.receive(packet);
时,如果它当前处于阻止模式,则会抛出SocketException
阻塞在catch (IOException e)
块中,并且堆栈跟踪是打印。
答案 1 :(得分:3)
此异常的唯一真正问题是您无法轻易将其与实际I / O错误区分开来。我建议切换到使用SocketChannel而不是Socket - 然后你可以中断你的服务器线程,它会抛出一个ClosedByInterruptException,你可以专门捕获和处理它。