我正在开发一个Google Glass应用,它需要在工作线程中侦听UDP数据包(与发送UDP数据包的现有系统集成)。我之前发布了一个问题(请参阅here),并收到了一个答案,为如何执行此操作提供了一些指导。使用其他讨论中的方法,我将有一个在DatagramSocket.receive()上被阻塞的工作线程。
进一步阅读告诉我,我需要能够按需启动/停止此操作。所以这让我想到了我在这里发布的问题。如何以能够中断(优雅地)UDP监听的方式执行上述操作?有没有什么方法可以“很好地”让套接字从另一个线程中断出receive()调用?
或者是否有另一种以可中断方式侦听UDP数据包的方法,因此我可以根据需要启动/停止侦听器线程以响应设备事件?
答案 0 :(得分:1)
我的建议:
private DatagramSocket mSocket;
@Override
public void run() {
Exception ex = null;
try {
// read while not interrupted
while (!interrupted()) {
....
mSocket.receive(...); // excepts when interrupted
}
} catch (Exception e) {
if (interrupted())
// the user did it
else
ex = e;
} finally {
// always release
release();
// rethrow the exception if we need to
if (ex != null)
throw ex;
}
}
public void release() {
// causes exception if in middle of rcv
if (mSocket != null) {
mSocket.close();
mSocket = null;
}
}
@Override
public void interrupt() {
super.interrupt();
release();
}
干净的切割,简单,总是释放和打断在2种情况下干净利落。