2012-07-04 2 views
1

Я разработка Android приложении 3.1 Tablet, который запускает сервис с этой темой:Прерывать поток, когда он находится на socket.receive (пакет); выдает ошибку

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);?

+1

Если это socket.receive, который бросает это исключение, я предполагаю, что это нормальное поведение, так как вы фактически прерываете вызов, закрывая сокет. –

+0

Спасибо. Так что мне не нужно беспокоиться, не так ли? – VansFannel

+2

читайте это: http://stackoverflow.com/questions/7962121/how-can-i-stop-the-block-method-datagramsocket-receive-in-a-thread –

ответ

3

Единственная реальная проблема с этим исключением заключается в том, что вы не можете легко отличить ее от фактической ошибки ввода-вывода. Я бы предложил переключиться на использование SocketChannel, а не на Socket, - тогда вы можете прервать поток вашего сервера, и вместо этого он будет генерировать исключение ClosedByInterruptException, которое вы можете поймать и обработать.

2

Согласно javadoc of the close method:

Any thread currently blocked in an I/O operation upon this socket will throw a SocketException.

Так что, когда вы звоните close, socket.receive(packet);, если он находится в режиме блокировки, выбросит SocketException, который пойман в вашем catch (IOException e) блоке и StackTrace печатается.

+0

Спасибо. Так что мне не нужно беспокоиться, не так ли? – VansFannel

+1

Это обычное поведение: когда вы закрываете сокет, он перестает делать то, что он делает, и дает вам знать об этом. Затем вы можете игнорировать это исключение, потому что вы специально закрыли сокет. Но вы можете захотеть выполнить какие-то проверки, поскольку они могут быть закрыты по другим причинам, например. соединение потеряно. – assylias