我的MainActivity启动另一个名为UdpListener的线程。在onResume中,线程将被启动(这是有效的),在onPause它应该停止,但socket.close()在LogCat中引起错误消息" 系统调用被取消&#34 ;。 UdpListener本身在JUnit测试中工作正常,所以这必定是某种Android问题。
这些是我的线程的相应方法:
private void setThreadRunning(boolean running) throws MyOwnException {
this.running = running;
if (running) {
try {
serverSocket = new DatagramSocket(9800);
}
catch (SocketException e) {
exceptionThrown = true;
this.running = false;
Log.e(TAG, e.getMessage());
if (serverSocket != null && !serverSocket.isClosed()) {
serverSocket.close();
}
throw new MyOwnException(e);
}
}
else {
if (serverSocket != null && !serverSocket.isClosed()) {
serverSocket.close();
}
}
}
public void stopThread() throws MyOwnException {
setThreadRunning(false);
}
MainActivity.onPause():
@Override
public void onPause() {
super.onPause();
try {
udpListener.stopThread();
}
catch (MyOwnException e) {
//TODO AlertDialog
}
}
将执行else分支的serverSocket.close()并导致LogCat条目,但为什么?
更新
也许Dalvik认为这是错误,因为close()会在当前阻塞的每个线程上抛出SocketExceptions" receive",但我不确定此异常是否与此问题有关。
http://docs.oracle.com/javase/1.4.2/docs/api/java/net/DatagramSocket.html#close()
答案 0 :(得分:0)
当我使用SocketException try..catch在run方法中包围receive()调用时,错误不再出现。我想我的异常处理有一些副作用导致这个错误。