我的MainActivity啓動另一個稱爲UdpListener的線程。在onResume中,線程將被啓動(這工作),在onPause它應該停止,但是socket.close()在LogCat中導致錯誤消息「系統調用被取消」。 UdpListener本身在JUnit測試中工作正常,所以這必定是某種Android問題。Android socket.close()導致「系統調用被取消」?
這是我的線程相應方法:
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的進入,但爲什麼?
UPDATE
也許Dalvik的認識到這是錯誤的,因爲接近()每個線程目前在「接收」阻塞拋出SocketExceptions,但我不知道這是例外情況與此相關的問題。
http://docs.oracle.com/javase/1.4.2/docs/api/java/net/DatagramSocket.html#close()
你是什麼意思?當你調用stopThread()時,它會在else分支中關閉你的套接字。清單文件中的權限是什麼? – hovanessyan
它會關閉套接字,但它會導致錯誤(LogCat顯示爲錯誤),正如我所說的。我的權限是WRITE_EXTERNAL_STORAGE和INTERNET,但我不認爲它是一個權限問題,因爲爲什麼我應該能夠啓動線程。 – Bevor