My 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
}
}
serverSocket.close() ветки else будет выполняться и вызывает запись LogCat, но почему?
ОБНОВИТЬ
Возможно, Dalvik распознает это как ошибку, потому что close() выбрасывает SocketExceptions на каждый поток, текущий в блоке "получать", но я не уверен, связано ли это исключение с этой проблемой.
http://docs.oracle.com/javase/1.4.2/docs/api/java/net/DatagramSocket.html#close()
Когда я окружаю вызов receive() в методе запуска с помощью SocketException try..catch, ошибка больше не возникает. Я предполагаю, что моя обработка исключений вызвала некоторый побочный эффект, вызвавший эту ошибку.