2012-01-22 22 views
1

我的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()

+0

你是什麼意思?當你調用stopThread()時,它會在else分支中關閉你的套接字。清單文件中的權限是什麼? – hovanessyan

+0

它會關閉套接字,但它會導致錯誤(LogCat顯示爲錯誤),正如我所說的。我的權限是WRITE_EXTERNAL_STORAGE和INTERNET,但我不認爲它是一個權限問題,因爲爲什麼我應該能夠啓動線程。 – Bevor

回答

0

當我包圍了SocketException在try..catch run方法接收()調用,這個錯誤不會再occure。我想我的異常處理有一些副作用導致這個錯誤。