我的 MainActivity 启动另一个名为 UdpListener 的线程。在 onResume 中,线程将被启动(这是可行的),在 onPause 中它应该停止,但是 socket.close() 会在 LogCat 中导致错误消息“系统调用被取消”。 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 “接收”,但我不确定这个异常是否与这个问题有关。
http://docs.oracle.com/javase/1.4.2/docs/api/java/net/DatagramSocket.html#close()
最佳答案
当我用 SocketException try..catch 包围 run 方法中的 receive() 调用时,错误不再发生。我猜我的异常处理有一些副作用导致了这个错误。
关于java - Android socket.close() 导致 "the system call was canceled"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8960776/