私の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エントリが発生しますが、なぜですか?
UPDATE
おそらく、close()が現在「受信」でブロックされているすべてのスレッドでSocketExceptionsをスローするため、Dalvikはこれをエラーとして認識しますが、この例外がこの問題に関連しているかどうかはわかりません。
http://docs.oracle.com/javase/1.4.2/docs/api/java/net/DatagramSocket.html#close()